All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Patch release fixing a long-standing Workspace UI bug where folders refused to open and the dev console flooded with 400 Path is a directory requests, plus a small UX win on the file share dialog (reuse existing share links instead of generating a new token every time). Also includes the upstream PR #51 (private-repo plugin update flow + ClickUp webhook compat + DetachedInstanceError).
dashboard/frontend/src/App.tsx— section-stablerouteKeyfor theSectionBoundary. Previously everynavigate({replace:true})inside/workspace/*,/agents/:name,/tickets/:id,/skills/:nameand/docsproduced a newlocation.key, which changed the boundary's Reactkeyand remounted the entire page. In the Workspace this wipedselectedPath,expandedstate inTreeItem, and refs on every folder click — folders never stayed open and the URL→state effect re-fired the file probe (GET /api/workspace/file?path=workspace/development→ 400) on every mount. Now subpaths within the same section share one stable key; the boundary still resets between sections.dashboard/frontend/src/components/workspace/FileTree.tsx— split the toggle inTreeItem.handleClickinto explicit open / close branches. The previoussetExpanded(prev => !prev)toggle was vulnerable to any re-trigger flipping a freshly-opened folder back closed.dashboard/frontend/src/pages/Workspace.tsx— addedknownDirsRefso the URL→selectedPathdeep-link effect can skip the redundantGET /api/workspace/file?path=…probe when the path is already known to be a directory (e.g. user just clicked it). The probe used to 400 on every directory navigation, polluting server logs and racing withsetSelectedPathre-renders.
dashboard/backend/routes/shares.py— newGET /api/shares/by-path?path=Xendpoint returning the most recent active (enabled + non-expired) share for a path, or 404. Same permission gate (workspace.manage) and folder-access check asPOST /api/shares.dashboard/frontend/src/components/workspace/ShareDialog.tsx— on open, probeby-pathand reuse any existing active share instead of always minting a new token. The dialog now shows the existing link with formatted expiry, view counter, and a destructive Revoke and regenerate action when you actually want to rotate the link. New share creation only happens when there isn't one already.
- Plugins + triggers — private-repo update flow, ClickUp webhook compatibility, and a
DetachedInstanceErrorfix landed via PR #51 ahead of this patch.
Patch release working around a bug in @anthropic-ai/claude-agent-sdk (v0.2.104+) where Linux auto-discovery tries the -musl platform package before glibc regardless of the host's actual libc. On glibc VPS installs (Ubuntu / Debian) with both platform packages present in node_modules, the SDK spawned the musl binary and failed with Claude Code native binary not found because the musl dynamic loader was absent — breaking every chat session on the affected VPS with no local repro. See upstream issue #296.
dashboard/terminal-server/src/chat-bridge.js— addresolveClaudeExecutable()that probes/liband/usr/libforld-musl-*to detect the host's libc, then reorders the candidate platform packages to prefer the matching variant (glibc-first on glibc hosts, musl-first on Alpine/musl). Resolved path is passed viaqueryOptions.pathToClaudeCodeExecutableso the SDK skips its own (buggy) discovery. RespectsCLAUDE_CODE_EXECUTABLEenv override and falls back to SDK auto-discovery if no candidate resolves (preserves macOS dev flow).
dashboard/terminal-server/package.json— pin@anthropic-ai/claude-agent-sdkto exact0.2.119(was^0.2.104) so freshnpm installon the VPS doesn't drift into a newer minor with the same or worse regression before upstream lands a libc-aware fix.
Patch release fixing a tsc -b strict-mode type error in PluginDetail.tsx that broke fresh frontend builds (npm run build fails with TS2322 on manifest['description']). Local incremental builds passed because .tsbuildinfo cached the file as clean; fresh installs hit the error on first compile.
PluginDetail.tsx— narrowmanifest['description']withtypeof === 'string'before using it as a truthy check and JSX child. PreviouslyRecord<string, unknown>lookup was cast only in the<dd>body, not in the conditional, sotsc -brejected the truthy check asunknownin JSX.
Minor release introducing the Plugin System v1 — a full extensibility layer with 15 capabilities, pre-install security scanning, per-capability toggles, update diff previews, and a reference plugin (pm-essentials). Ships alongside a security-hardening pass (PRD #37) and a batch of community-reported fixes.
- Plugin System v1 — 15 capabilities, security gate, reference plugin (#41) — end-to-end extensibility: Pydantic-validated manifests, git/zip/local install with SHA-256 integrity check, semver-aware migration runner with rollback, atomic file ops, Claude Code hooks dispatcher (PreToolUse / PostToolUse / Stop / SubagentStop) with per-plugin SQLite circuit breaker, and crash recovery for orphaned installs. Capabilities include agents, skills, commands, rules, routines, heartbeats, widgets, readonly_data, writable_data, claude_hooks, goals, tasks, triggers, MCP servers and custom UI pages. Plugin-contributed rows are tagged with
source_pluginacrosstickets,projects,goals,missions,goal_tasksandtriggersso uninstall cleans them without touching user data. - Plugins REST API + dashboard UI — full CRUD (
GET/POST/PATCH/DELETE /api/plugins), curated marketplace listing, upload endpoint (ZIP / tar.gz, 20 MB cap, zip-slip guard), preview-before-install flow, audit log, and per-plugin widget limits per tier (essential / standard / power). New/pluginspage with marketplace grid, install wizard (source → security scan → config → confirm), plugin detail with widgets, capabilities toggles, MCP banner, and Update button with diff preview (Wave 1.2). New/mcp-serverssystem page aggregating~/.claude.jsonentries grouped by plugin / native with masked env values. - Plugins CLI (
cli/src/commands/plugin.mjs) —plugin init(scaffold from template),plugin install <source>,plugin list,plugin uninstall <slug>,plugin update <slug>. Starter template undercli/templates/plugin-skeleton/ships with a pre-filledplugin.yaml, sample agent, and README. - Plugin security scan (Wave 2.5) — hybrid regex + LLM scanner with 13 pattern categories, 57-domain whitelist, anti-hallucination guard, 7-day cache in
plugin_scan_cache, and an APPROVE / WARN / BLOCK adaptive button with admin BLOCK override. Newplugin-security-scanskill exposes the semantic scanner. - Plugin MCP servers (Wave 2.3) — plugins can declare MCP servers with command whitelist and shell-metachar block; 6-layer atomic write to
~/.claude.jsonwith flock, timestamped backups (retention 10) and drift detection (name + args_hash match). UI shows a restart-Claude-CLI callout on install and an MCP diff section in update preview. - Plugin integrations (Wave 2.2r) — plugins can declare env-var-based integrations with optional HTTP health checks running as in-process heartbeats (zero Claude CLI overhead). New Plugin Integrations section on
/integrationswith schema-driven configure modal and secret masking. - Plugin custom UI (Wave 2.1) — plugins can contribute React pages mounted at
/plugins-ui/:slug/*, sidebar groups, and writable SQLite resources with column allowlist + jsonschema validation.window.EvoNexusSDK injected post-login for plugin frontends. - Plugin per-capability toggles (Wave 1.1) — granular ON/OFF per capability without uninstalling the plugin. Disable cascades to
.claude/{agents,skills,commands}/plugin-{slug}-*(rename to.disabled), routines skipped by the scheduler, hooks and heartbeats skipped by their dispatchers. - Plugin management skills —
plugin-install,plugin-list,plugin-uninstall,plugin-update,plugin-marketplace,plugin-healthexpose plugin operations to all agents. agent_meta_seed.py— 38-agent seed served viaGET /api/agent-meta(in-process cache + invalidation). Plugin agents contribute metadata viamanifest.metadata.icon+ per-agent avatars; frontend registry (agent-meta.ts) is hydrated once post-login and plugin cards render custom icons with img fallback.- Merged routines listing —
/api/routinesnow merges declared routines (viadiscover_routines()) with execution metrics so newly installed plugin routines and unrun core routines show up in/routineswith zeroed metrics. EVONEXUS_DEV=1— toggles Flask's auto-reloader (debug=True,use_reloader=True) for backend development. Default remains off; production uses systemd/docker.docker-compose.proxy.yml(#45) — sibling compose file for reverse-proxy hosts (Coolify, Dokploy, Traefik, Caddy): usesexpose:instead ofports:so the proxy owns external traffic while containers stay reachable by name inside the Docker network. Volumes named identically tohub.ymlfor no-loss migration.docs/knowledge-database.md(#46) — provider cheat-sheet for Supabase / Neon / Railway PgBouncer gotchas (port 5432 vs 6543, Supabase IPv6-only edge case, error reference table). Inline hint added under the Knowledge connections wizard input.scripts/clean-history.sh(#26) — safe-by-default dry-run helper that clones the remote as--mirrorand previews removal of ~283 MB of orphaned PNG avatar blobs viagit filter-repo --path-regex. Verifies develop/main HEAD trees are byte-identical and all tags preserved before the maintainer force-pushes.CONTRIBUTING.mdgains the partial-clone recipe (git clone --filter=blob:none) so contributors download ~10 MB instead of ~290 MB in the interim.
/api/health/deepnow requires an authenticated admin session (PRD security hardening, #37) — previously leaked filesystem paths, provider identity, secret-key source, and error details to unauthenticated callers./api/healthis now a minimal public liveness probe returning status only. Tooling scraping/api/health/deepfor internals must authenticate.- Frontend route splitting (#37) — top-level route bundles are code-split so the main chunk size drops substantially on first load.
- Plugin install sources restricted (hardening) —
resolve_sourcenow rejects local filesystem paths,file://,ssh://and non-HTTPS schemes with a clearValueError. Onlygithub:,https://tarballs, or uploaded ZIP / tar.gz archives are accepted. Closes the doc/code mismatch where the skill promised rejection but the code accepted anything viaPath(s). - Plugin triggers ship disabled by default — regardless of YAML value, unless explicitly
"true", so a malicious plugin cannot auto-fire hooks on install. - Telegram notifications moved from skills to routines —
run_skill(notify_telegram=True)appends a one-shot send instruction at the end of the prompt, guaranteeing exactly one send per execution (was duplicated when skills embedded the instruction themselves). Skills cleaned:prod-end-of-day,prod-good-morning,pulse-faq-sync,pulse-daily. - Integration status verifies all declared env keys (#49) —
list_integrationspreviously checked only a single key per entry, so Evolution API / Evolution Go / Evo CRM showed as "configured" with only the token set (URL missing) or vice-versa. Schema is nowkeys: list[str]; an integration is considered configured only when every declared key is non-empty. - Bling integration keys corrected (#49) —
BLING_ACCESS_TOKEN(which existed nowhere in the repo) replaced withBLING_CLIENT_ID/BLING_CLIENT_SECRETused by the real OAuth2 flow. Migration: users who setBLING_ACCESS_TOKENmanually must runmake bling-authto obtain the OAuth credentials. - Omie integration now requires both
OMIE_APP_KEYandOMIE_APP_SECRET— backend was only checking the key, so a half-configured Omie appeared green (#49).
scripts/start-services.shno longer kills unrelated processes (#18) —pkill -f 'python.*app.py'matched everyapp.pyon the host, killing unrelated services. Replaced with an explicit pinned match on the venv interpreter + absolute script path, and TCP 8080 (orEVONEXUS_PORT) is now freed directly viafuser/lsofbefore restart — falls back tolsof -ti tcp:$PORT | killwhenfuseris absent (BSD-ish / macOS).- Terminal client detects RFC1918 + CGNAT hostnames as local (#35) — previously only
localhost/127.0.0.1were treated as local, so bare-metal installs behind no reverse proxy fell back to/terminalon the same origin, which didn't exist. Heuristic widened to RFC1918 (10/8,172.16/12,192.168/16), RFC6598 CGNAT (100.64.0.0/10, common on Brazilian VPS), link-local (169.254/16), IPv6 loopback (::1), and IPv6 link-local (fe80:). NewVITE_TERMINAL_URLexplicit override for edge cases (reverse proxy on a private IP).deriveWsBaserewritten to useURL()instead of a regex that silently dropped thehttpsbranch and mangled uppercase schemes. - Plugin uninstall sweeps leftover
plugin-{slug}-*files —reverse_remove_from_manifestwalks.install-manifest.json, but if that manifest is missing / corrupt / predates the name-rewrite change, files in.claude/{agents,skills,rules,commands}/stayed behind and the next install hit 409. An unconditional sweep runs after the manifest pass. - Plugin install seeds an anchor mission per plugin — plugins seeding projects without
mission_idleft them orphaned and invisible in/goals. Installer now synthesizes one mission per plugin (plugin-{slug}-root) when the YAML doesn't declare one and links all orphan projects to it. Missions getsource_plugintoo so uninstall cleans them. - Plugin widget listing reads
ui_entry_points.widgets— was reading a non-existentmanifest.manifest.widgetskey and returning[]regardless of mount point. - Plugin install falls back to first
migrations/*.sqlwhenmigrations/install.sqlis missing, so plugin authors using theNNN_description.sqlconvention don't have to rename. - Plugin skills install as directory trees —
copy_with_manifestnow copiesskills/<name>/as a whole directory and rewrites thename:field insideSKILL.mdto match the prefixed dirname, enforcing the Claude Code contract thatname== filename. Agents / commands / rules similarly get theirname:frontmatter rewritten. - Plugin
GET /api/plugins/<slug>/auditendpoint — was missing, soPluginDetail.tsxhit the SPA catch-all, gotindex.htmlback, and threwUnexpected token '<'on JSON parse. - Plugin heartbeat agent references get auto-prefixed — plugins can declare
assignee_agent: pm-novainstead of the fullplugin-pm-essentials-pm-nova; the installer rewrites bare references to match the prefixed file. - Plugin update endpoint now uses
resolve_source— works fromgithub:/https:/// uploaded path (was local-only). PATCH /api/triggers/<id>— the endpoint was simply missing.- Brain Repo sync no longer blocks HTTP requests — new
brain_repo/job_runner.pybackground executor serialises sync / milestone / bootstrap ops.POST /sync/force,/sync/cancel,/tag/milestonenow enqueue jobs and return immediately;GET /statusexposes job state./backupsand/brain-repopages poll state and expose a Cancel button (cooperativecancel_requestedflag checked between git steps). ticket_janitor.py— guards againstIsADirectoryErroron the health-check path that crashed on certain setups.
- Pre-install plugin security scanning — every plugin installed from an external source runs through a hybrid regex + LLM scanner before any file lands on disk. APPROVE / WARN / BLOCK with admin override + audit trail.
/api/health/deeprequires admin — see Changed.- Plugin install sources restricted to HTTPS / github / upload — see Changed.
- Plugin triggers disabled by default — see Changed.
Minor release introducing the Brain Repo — automatic GitHub versioning of workspace memory and customizations — plus a full onboarding wizard and a unified /backups page covering Local, S3 and Brain Repo destinations.
- Brain Repo — GitHub versioning of
memory/,workspace/,customizations/andconfig-safe/— a dedicated private repo (evo-brain-<username>) is created or detected per user. A file watcher with 30s debounce persists every change to GitHub; daily, weekly and milestone snapshots can be restored via a streaming SSE engine. GitHub tokens are Fernet-encrypted at rest withBRAIN_REPO_MASTER_KEY(auto-generated at first boot);connect/syncendpoints return500 CRYPTO_UNAVAILABLEwhen encryption is unavailable — plaintext fallback was explicitly removed. A 21-pattern secrets scanner runs before every push (AWS / GitHub / Anthropic / OpenAI / Stripe / JWT / SSH, etc.) — matched files are deleted and never leave the machine. - Onboarding wizard — post-account-creation flow replacing the cold-drop into Overview. First-time users pick an AI provider (Anthropic / OpenAI / OpenRouter / Codex OAuth) with per-provider sub-flows and optionally connect a brain repo; returning users can restore from any snapshot via a type-to-confirm safety gate. Includes an
OracleWelcomeBanneron/agents(one-time, dismissable). - Unified
/backupspage — single surface for Local ZIPs, S3 and Brain Repo with 3 destination cards, tabs (counts per source), import dropdown (upload.zip+ pull from Brain Repo), contextual restore modal with SSE progress and a danger state when crypto is broken. 30s visibility-aware polling keeps watcher results fresh. - Brain Repo settings page —
/settings/brain-repowith status card (connected / pending / last_error / crypto danger), Sync-now, Create-milestone and Disconnect actions, fully i18n'd. - i18n — ~270 new keys across
onboarding.*,restore.*,brainRepoSettings.*,backups.*,agents.welcomeBanner.*(en-US / pt-BR / es), with identical key trees and natural translations. - CLI —
setup.pynow prompts for brain-repo during initial setup and collects the PAT;backup.py --target githubpushes a manual sync through the dashboard's own code path. - Dev environment —
docker-compose.dev.ymlwith live-reload backend + named volumes,Dockerfile.devwith--legacy-peer-depsand globally-installed@anthropic-ai/claude-code+@gitlawb/openclaude, CRLF-safe entrypoint scripts, and a step-by-stepDEV-SETUP.md.
/api/backups/configextended withbrain_repo_configured,brain_repoandbrain_crypto_readyso the tabs UI renders in one round-trip.lib/api.ts—buildError()now extracts the JSONerror/description/messagefrom non-OK responses while preserving the status-code prefix, so existing.includes('401')callers keep working.useGlobalNotifications— HTTP health-probe before WS + visibility guard, eliminating theWebSocket connection failedconsole spam on pages that don't use the terminal.App.tsx— onboarding guard treatsnullstate as "needs onboarding" and redirects accordingly.
- Restore SSE crash on
execute_restore(install_dir=...)— call-site kwargs now match the function signature(repo_url, ref, token, install_dir, include_kb, kb_key_matches)1:1;install_dirresolves to the workspace root (where the SWAP_DIRS are replaced), not the brain-repo clone. A new import-time signature check inbrain_repo/__init__.pyemits a CRITICAL log on drift so future regressions are visible at startup. - Watcher no-op on workspace changes —
sync_force,tag_milestoneand the watcher now mirrormemory/workspace/customizations/config-safefrom workspace → brain-repo clone beforegit add, socommit_allactually sees the new files. start_brain_watchercircular import — now accepts the Flask app explicitly instead of importing it, eliminating the startup "current Flask app is not registered with this 'SQLAlchemy' instance" warning that silently disabled auto-sync.
Patch release with a P0 race-condition fix in the container entrypoint plus a complete Docker install experience (ready-to-run compose + full tutorial).
-
Race condition on shared
/workspace/configvolume (P0) — whendashboard,telegramandschedulerboot in parallel against the same named volume (the canonical Docker / Swarm / Portainer deploy pattern), the first-boot bootstrap raced on four operations:[ ! -f .env ] && cp .env.example .env— one container wins, others crash withFile exists. Scheduler died visibly on every fresh v0.30.3 deploy.[ ! -f ] && cpforproviders.json/heartbeats.yaml— same race.grep -q EVONEXUS_SECRET_KEY || echo … >> .env— two processes both see "not found" and append two different keys; Flask picks one at random per request, invalidating sessions silently.- Same pattern for
KNOWLEDGE_MASTER_KEY— silently corrupted Knowledge Base encryption, losing all configured DB connections on second boot.
Fix: wrap the whole bootstrap in
flockon a lockfile inside the shared volume, serializing all containers regardless of start order. Also addedcp -n(no-clobber) as belt-and-suspenders.flockis part ofutil-linux, already present in both base images.
docker-compose.hub.yml— ready-to-run compose file that pullsevoapicloud/evo-nexus-*from Docker Hub instead of building from source. Usesdepends_on: condition: service_healthyto order the boot (dashboard first, then telegram/scheduler) — defense-in-depth on top of the flock fix. This is the recommended install for end users:curl -O …docker-compose.hub.yml && docker compose -f docker-compose.hub.yml up -d.docs/guides/docker-install.md— complete Docker install guide. Prerequisites (Docker Engine 24+ is the only requirement — image ships everything), one-command boot, first-boot wizard walkthrough, update flow (docker compose pull && up -d), backup/restore recipes, advanced section documenting how to pass secrets viaenvironment:or Docker Secrets (for CI/CD and immutable-infra users who prefer to keep secrets out of the.envvolume), running behind Caddy for public HTTPS, troubleshooting table.- Install method chooser in
docs/getting-started.md— table at the top comparing Docker vs CLI (npx) vs manual clone, with clear guidance on which to pick.
README.md— Docker promoted to Method 1 in Quick Start. Prerequisites split into two tracks (Docker-only vs CLI-flow), reflecting that the Docker image ships Claude Code, Python, Node, uv andghbaked in.docs/guides/updating.md— newdocker compose -f docker-compose.hub.yml pull && up -dsection documenting the Docker Hub upgrade path. Swarm examples bumped tov0.30.4.
Patch release completing the Docker Hub migration: official images now ship as multi-arch manifests (linux/amd64 + linux/arm64) so ARM hosts (Apple Silicon, AWS Graviton, Oracle Cloud ARM, Raspberry Pi, many modern VPS) can pull without platform overrides.
- Multi-arch Docker images —
.github/workflows/docker-publish.ymlnow runsdocker/setup-qemu-action@v3and passesplatforms: linux/amd64,linux/arm64tobuild-push-action. Every published tag (latest,vX.Y.Z,X.Y,X.Y.Z,main,sha-*) ships a manifest list covering both architectures. Thenode-ptynative addon compiles from source via node-gyp inside the arm64 builder, so there's no prebuilt-binary-per-arch concern.
evonexus.portainer.stack.yml— deleted the personal Portainer template from the repo root. It was a pre-configured stack for a specific host (advancedbot.com.br,network_publicnetwork) pointing at a fork's Docker Hub namespace (marcelolealhub/*), which could mislead new users into pulling from the wrong registry. The canonical template remains atevonexus.stack.yml, which already supports Portainer/Traefik deployments and points at the officialevoapicloud/evo-nexus-*images.
Patch release focused on CI/distribution: Docker images now ship from the official evoapicloud namespace on Docker Hub (public, no auth required on Swarm managers), and the legacy dashboard-only workflow was removed to unblock the build pipeline.
- Docker images published to Docker Hub under
evoapicloud/— the Swarm workflow (.github/workflows/docker-publish.yml) now pushesevo-nexus-runtimeandevo-nexus-dashboardtodocker.io/evoapicloud/*instead ofghcr.io. RequiresDOCKERHUB_USERNAME+DOCKERHUB_TOKENsecrets on the repo. Theevonexus.stack.ymltemplate andREADME.swarm.mdwere updated to reference the public images — noOWNERplaceholder to fill in, nodocker loginneeded on Swarm managers.
- Redundant
dashboard.ymlworkflow — deleted.github/workflows/dashboard.yml, which built a Python+React-only dashboard image (Dockerfile.dashboard) that nothing consumes. The Swarm workflow already produces a strict superset (with terminal-server and both CLIs). This also fixes the build failure onmaincaused by a TypeScript peer-dep conflict in the legacy Dockerfile.
Patch release focused on thread UX polish: session now swaps cleanly when switching threads via the sidebar, the agent is briefed explicitly about running inside a persistent thread (not a fresh one-shot session), the assignee dropdown stops hiding agents, and fresh installs no longer inherit Evolution-specific goal seed data.
- Thread switch leaked previous conversation — switching threads via the sidebar kept
threadSessionIdpinned to the old ticket and<AgentChat>kept rendering the old messages until a full page reload (or going back to/topicsand entering again). Two fixes inTicketDetail.tsx: (1) a new effect resetsthreadSessionIdwheneverticket?.idchanges so the auto-init re-runs for the new ticket; (2)<AgentChat key={ticket.id}>forces a full remount so the WebSocket, message buffer and internal effects restart cleanly. - Topics assignee dropdown hid 18 of 38 agents — the Assign-to-agent combobox in
/topicssliced the filtered list at 20 items (filteredAgents.slice(0, 20)), silently dropping agents whose slugs come later alphabetically (frommonward). Removed the slice and bumpedmax-h-48tomax-h-72so ~12 agents are visible at once without scrolling and all 38 are reachable. - Goals: Evolution-specific seed leaking into open-source installs —
dashboard/backend/app.pywas seeding a hardcoded "Evolution Revenue $1M Q4 2026" mission with 3 projects (evo-ai, evo-summit, evo-academy) and 5 goals on first boot. Removed the seed block so new instances start empty. The/goalsempty state now points users at the/create-goalskill instead of the misleading "Run the backend migration to seed initial data" message. Existing installations with the seed applied can clean it withDELETE FROM goal_tasks; DELETE FROM goals; DELETE FROM projects; DELETE FROM missions;.
- Thread context now always injected into the agent's system prompt — when a thread session initialises,
TicketDetail.initThreadSessionalways builds a "Thread Context" block explaining that the agent is running inside a persistent thread (not a fresh session): the thread title, description, assigned agent slug, default workspace folder, memory file path, summarization cadence, and resume behaviour. It also tells the agent not to re-invoke itself via theAgenttool (which was causing confusing@zara-cscalling@zara-cspatterns). Memory.md content is appended when present, so empty threads still get the full context and populated threads still surface prior-session knowledge. Respects the existing!sdkSessionIdguard inchat-bridge.js— only injected on fresh sessions, not on--resume.
Minor release adding a unified Activity Log — a single page aggregating execution history across routines, heartbeats and triggers so the user can answer "what did the system just do?" without visiting three separate pages.
/activity— Unified Activity Timeline — new page aggregating execution history across all three automation primitives: scheduler routines, agent heartbeats, and event-based triggers. Presented as a reverse-chronological timeline (Linear / Vercel Logs / GitHub Actions style). Each row shows name + type badge + status pill (success / error / running) + duration + relative time. Click opens a right-side drawer (480px) with full output, metadata (started / finished / exit code / cost / tokens), and a "Open in dedicated page" link.- Filters: multi-select type chips (Routines / Heartbeats / Triggers), status dropdown (All / Success / Error / Running), period tabs (Today / 7d / 30d / All), debounced search (300ms, client-side).
- Auto-refresh: 30s interval, paused automatically when the browser tab is in background (
visibilitychange). - Load more: client-side pagination at 50 items per page.
- Accessibility: drawer is
role="dialog"aria-modal="true", Escape closes, click-outside closes. - Nav: new sidebar item "Activity" (
Atividadept-BR /Actividades) under the operations group.View all →on the Overview Routines card now points to/activityfor a unified journey. - Data sources: reuses existing backend endpoints —
GET /api/routines/logs,GET /api/heartbeats/{id}/runs,GET /api/triggers/{id}. Client-side aggregation (N+1 fetches viaPromise.all) — acceptable for v1 volume; server-side aggregated endpoint can come later if needed.
- Activity parser — real routine log shape — initial parser was looking for
log.name/log.routine_name/log.status/log.exit_code, which don't exist inADWs/logs/YYYY-MM-DD.jsonl. Real shape is{ timestamp, run, prompt, returncode, duration_seconds, input_tokens, output_tokens, cost_usd }. Parser now readsrunas the routine name (so rows showgood-morning,end-of-day, etc. instead ofUnknown Routine), derives status fromreturncode, and surfacescost_usd/ token counts / prompt preview in the drawer.
/api/routines/logsonly accepts?date=, so the period filter (7d / 30d / All) affects heartbeats and triggers only — routines always show today. The routine log endpoint will needfrom/toparams to honor longer periods; deferred to a follow-up.- Client-side aggregation means timeline loads can do up to
1 + N + Mrequests (1 for routines today, N for each heartbeat's last 10 runs, M for each trigger's detail). Fine under ~20 heartbeats/triggers, may need batching later.
Patch release: fix the infinite page scroll in thread mode so the embedded chat behaves exactly like the agent chat (fixed input at the bottom, messages scroll inside the container), and harden .gitignore against nested .claude/ folders that agents were accidentally creating from subdirectory cwds.
- Thread mode — infinite page scroll —
TicketDetailin thread mode usedh-fullbut the parent<main>inApp.tsxonly appliedh-screen overflow-hiddenfor/agents/:idand/workspace/*routes. Any route falling into the default branch usedoverflow-autowithout a fixed height, so the embeddedAgentChatgrew with its message list and pushed the input field off-screen. Fix: addisTicketDetailmatcher toApp.tsxso/tickets/:idjoins the fixed-viewport branch; inTicketDetail.tsxthe non-thread (document) view gains its ownh-full overflow-autowrapper with the original padding to preserve its vertical-document layout. Thread mode now mirrors the agent chat exactly.
.gitignorehardening — nested.claude/in subdirectories — agents running fromdashboard/frontend/(e.g.,cd dashboard/frontend && npm run build) were creatingdashboard/frontend/.claude/agent-memory/relative to cwd instead of writing to the canonical.claude/at the repo root. Content was already ignored by the existing.claude/agent-memory/rule, but the.claude/folder itself showed up untracked in editors. Added**/.claude/agent-memory/anddashboard/*/.claude/patterns to block this at any depth.
Patch release: in-app toasts and confirm dialogs replacing 47 native alert()/confirm() calls, agent avatars in the Topics list, plus fixes for PR #30 (provider routing + docker) and the archive endpoint.
- In-app Toast system (
useToast) — stackable notifications in the bottom-right corner (max 5), auto-dismiss 4s, variantssuccess/error/warning/info. Replaces allwindow.alert()usage in the dashboard with a consistent, non-blocking pattern in the EvoNexus dark tone. Zero new dependencies (pure CSS keyframes + Context API). - In-app Confirm dialog (
useConfirm) — promise-based modal withdefault/dangervariants, keyboard support (Enter confirms, Escape cancels), focus on Cancel for danger variant (safer default). Replaces allwindow.confirm()usage. - Agent avatars in
/topicslist — threads now show the assigned agent's avatar (24px, same as the sidebar) instead of a generic green chat icon, matching the visual language ofThreadsSidebar. SharedAgentIconcomponent extracted from the sidebar for reuse.
- 47 UX call sites migrated from native dialogs to in-app components across
AgentChat,ChatSessionList,Backups,Heartbeats,Roles,Scheduler,Systems,Tasks,TicketDetail,Topics,Triggers,Users. All messages translated to pt-BR where they were in English. - Provider config centralized (PR #30) — shared
provider-config.jshelper in the terminal-server centralizes loading, env var allow-listing, and model capability detection (codevschat). Reduces duplication betweenchat-bridge.jsandclaude-bridge.js. - Chat uses OpenAI-compatible streaming for non-Anthropic providers (PR #30) —
/chat/completionsstreaming so chat-completion style models (GPT, Gemini, custom OmniRouter) work in dashboard Chat. Anthropic keeps the existing Agent SDK flow. - Terminal enforces code-only models for non-Anthropic providers (PR #30) — chat-completion models are now blocked in the Terminal with a clear error directing the user to the Chat instead.
- Telegram notification helper for ADW routines (PR #30) —
run_skill(..., notify_telegram=True)appends a deterministic notification instruction to the skill prompt so end-of-day and good-morning routines emit exactly one Telegram message via the MCPreply()call.ADWs/runner.pyalso exposes asend_telegram()helper that posts directly via Bot API as a fallback.
- Archive thread endpoint — 500 on re-archive —
shutil.movewas raisingOSErrorwhenmemory/threads/_archive/{ticket_id}/already existed from a previous partial archive. Now checks for existing path and falls back to a timestamped suffix; tombstone write is best-effort and wrapped in try/except; the endpoint surfaces a proper JSON error instead of a bare 500. - Docker dashboard container starts reliably (PR #30) —
npm install --legacy-peer-depsinDockerfile.swarm.dashboardavoids peer-dep install failures on fresh rebuilds (same pin already applied to the non-Docker install).
Patch iterating on the v0.29.0 thread-areas feature: UI rebrand, navigation polish, and fixes identified by the post-release verification pass.
- Renamed "Issues" → "Topics" across the UI — the feature evolved from a pure issue tracker into a container for both tasks and persistent chat threads, so the label no longer fit. Page file renamed
Issues.tsx→Topics.tsx, route moved/issues→/topicswith a 302 redirect preserving old bookmarks, sidebar nav item updated, breadcrumbTopics / {title}, i18n updated across 3 locales: enTopics, pt-BRTópicos, esTemas. Backend (ticketstable,/api/tickets/*endpoints,Ticketmodel) intentionally unchanged — pure UX rebranding, zero data migration.
- Threads sidebar — navigate between chat threads without leaving the conversation — when viewing a ticket in thread mode, a 280px sidebar now appears on the left listing all threads, grouped by agent (Clawdia, Kai, Flux…), with active/archived split. Active thread is highlighted with a green left border. Toggle button collapses to 48px (persisted in localStorage). Each item shows title + relative time (
há 2h,ontem,3d). On mobile (<768px), sidebar becomes a slide-in drawer triggered by aPanelLefticon — 85vw from the left with backdrop, Escape/click-outside/close to dismiss,role=dialogaccessibility. Desktop and mobile share the sameThreadsSidebarcomponent via anasDrawerprop; drawer lazy-mounts to avoid double-fetch. Pure CSS transitions, zero new dependencies. - Create workspace folders from the Convert to Thread modal —
+ Nova pastabutton inline in the folder dropdown opens an input accepting[a-z0-9-]+names (2-50 chars). Pressing Enter or clicking Create firesPOST /api/workspace/subfolders; new folder appears in the dropdown pre-selected, no page reload. Backend validates name pattern, defends against path traversal, returns 409 if folder exists, 201 with{name, path, full_path}on success.
convert-to-threadis now idempotent — calling the endpoint on a ticket that is already a thread returns 200 with the current ticket state instead of 409. Workspace path conflict (different path supplied) still returns 409workspace_path_conflictwith both paths in the error body. Prevents spurious errors when the UI double-fires the conversion.turn-completedis now race-safe monotonic — usesUPDATE ... WHERE message_count < :nwithn = current + 1, so concurrent calls with the same base value only increment once (second call is a silent no-op). Implements option (a) from the summary-trigger ADR without extra IO.- Convert to Thread modal warns about agent immutability — orange warning banner before the Convert button: "Após converter, o agente desta thread não poderá ser alterado. Crie uma thread nova para trocar de agente." Consistent with the existing
archivedbadge style. - Archived threads are read-only in the UI — when a thread's status is
archived, theTicketDetailshows a "📦 Thread arquivada — read-only. [Unarchive]" banner above the chat, disables interaction on the embeddedAgentChatviapointer-events-none opacity-60, and the Unarchive button callsPOST /api/tickets/:id/unarchive-threadto reactivate. Previously the UI allowed typing and only the backend rejected it.
- Thread Areas — persistent chat threads with isolated memory — tickets can be converted to "thread mode", turning them into a chat surface embedded in
TicketDetail(viaAgentChat). Each thread has a dedicated agent (immutable after conversion), a defaultworkspace_path, and a curatedmemory.mdatmemory/threads/{ticket_id}/memory.mdthat persists across sessions. Solves context degradation in long conversations: fixed scope (1 agent × 1 area) + periodic summarization +--resumeto keep conversation alive across days. Canonical use case: 1 financial agent × N companies, each as an isolated thread. Zero new tables — extendsticketswith 5 columns (workspace_path,memory_md_path,thread_session_id,message_count,last_summary_at_message). New endpoints:PATCH /api/tickets/:id/convert-to-thread(idempotent),POST /api/tickets/:id/turn-completed(monotonic withUPDATE WHERE message_count < :n),POST /api/tickets/:id/archive-threadand/unarchive-thread,GET /api/tickets/counts,GET /api/workspace/subfolders, plusdisplay_modefilter on list. UI:/issuessplits into "Threads" (💬) and "Issues" sections;TicketDetailrendersAgentChatwhen the ticket is a thread; modal guards agent immutability; archived threads show read-only banner with Unarchive action. Summary subsystem:summary_worker.pygenerates a new dated section inmemory.mdevery 20 turns;summary_watcher.pyheartbeat safety net (disabled by default) recovers turns missed when the browser tab closes mid-conversation (Option D + B hybrid per ADR). - Database integrations — Postgres, MySQL, MongoDB, Redis — four new skills (
db-postgres,db-mysql,db-mongo,db-redis) let the user query and explore databases configured via.env(DB_POSTGRES_N_*,DB_MYSQL_N_*,DB_MONGO_N_*,DB_REDIS_N_*). Integrations UI gains a full-page database section for connection management. Backend routedashboard/backend/routes/databases.pywires the dashboard to the skills. Documented indocs/integrations/databases.md.
- Heartbeats — accept
systemsentinel for infra-only heartbeats — allows heartbeats without an assigned agent (e.g.,summary-watcher) to register without tripping validation. - VPS install — survive first reboot — scheduler, start-services and firewall now persist across reboots on fresh VPS installs; prior setups would silently fail to come back up.
- Landing page reframe — work narrative over feature inventory — hero rewritten across all three locales: EN
"Your AI team, pre-assembled."/ PT"Seu time de IA, já montado."/ ES"Tu equipo de IA, ya armado.". New section "How Work Gets Done" with 4-beat narrative (Set the goal → Agents that know their lane → Docs your agents actually read → Every action, traceable). New standalone sections for Knowledge Base (hybrid RAG + BYO Postgres) and Heartbeats (cron for agents, with guardrails) — surfacing v0.25+v0.27 features that had been invisible on the LP. Full proposal doc inworkspace/marketing/[C]lp-reframe-v1.md(gitignored). - Setup wizard i18n (pt-BR / en-US / es) (#25) —
make setupnow asks for wizard language first (1=EN / 2=PT / 3=ES), then translates every user-visible message: banner, section headers, field prompts, progress lines, success/failure, final next-steps. Non-interactive contexts (EVO_NEXUS_AUTO_INSTALL=1, CI, pip backend) silently keepen-US. 153 keys per bundle, exact parity verified. - Auto-relocate install for non-root service user (#25) — detects when
SUDO_USERcannot read+enter the install dir viasu - <user> -c 'test -x ... && test -r setup.py'. If not, copies project to/home/<user>/evo-nexus, chowns, updates the globalWORKSPACE, andchdirs there. Every later step (uv sync, npm install, systemdWorkingDirectory, ownership fix) sees the new location automatically. Fixes the regression where direct-to-root installs withSUDO_USER=ubuntusilently failed on systemd unit start. - Tool bootstrap for non-root service user (#25) — new
_ensure_user_has_tools(user)bootstrapsuv,claude,openclaudeinto~/.local/for any non-root service user (mirrors what theevonexusauto-created branch already did). Idempotent — skips tools already present.
- Image optimization — 265 KB saved across 50 assets (#25) — PNG brand assets converted to WebP (quality 85, method 6), existing WebP avatars re-encoded at quality 82. Sweep over
dashboard/frontend/public/,public/,site/public/. Before: 2,302 KB. After: 2,037 KB. Favicons intentionally kept as PNG (cross-browser WebP favicon support still patchy; files already 4 KB). dashboard/frontend/.npmrc(#25) —legacy-peer-deps=truewith explanatory comment, sonpm install --silentinsidesetup.pyreturns 0 despitereact-i18next@15declaring peertypescript@^5while the dashboard pinstypescript@~6.- Landing page section reorder — hero → How Work Gets Done → Agents → Knowledge → Heartbeats → Screenshots → Integrations → Quick Start. Removed the 10-card "Features Grid" and the 6-card "Why EvoNexus?" section (dead post-reframe — the same arguments now live as prose in "How Work Gets Done"). Merged the 3-step "How It Works" into the Quick Start section above the terminal block. Removed the redundant Social Proof stats bar (numbers already in hero stats pills).
- Hardcoded counts updated — README, LP, and dashboard stats now show 190+ skills (was 175+) and 25 integrations (was 23-24 depending on location — inconsistent). Numbers verified against
ls .claude/skills/(190 dirs) and.claude/rules/integrations.md(25 entries). - Landing page copy — editorial pass in pt-BR / en / es — rewrote every user-facing string as if each locale were the original language, not a translation. Replaced abstract nouns with active verbs, dropped anglicisms (
pré-montado→já montado;pre-ensamblado→ya armado), killed SaaS clichés (never sleeps→never left hanging/nunca fica sem resposta/nunca se queda sin respuesta). Heartbeats section renamed fromAgents that wake on schedule→Agents on autopilotacross all three locales. - 5 placeholder integration icons removed from LP — LinkedIn, Amplitude, DocuSign, Bling, Asaas were rendering as generic Lucide
<Activity>,<FileText>,<Workflow>,<Zap>(and LinkedIn+Amplitude shared the same icon).react-icons/sihas no match for these brands; showing a wrong icon was worse than omitting. Integration count stays 25 in copy (real count fromintegrations.md) — logos on home just show the most recognizable. - iMessage channel clarified —
features.channels.descacross all locales now appends(macOS)qualifier, since iMessage ships via the@claude-plugins-officialplugin and depends on Messages.app being open on macOS. No behavior change, just accuracy.
start-services.shself-discovering install dir (#27) — replaced hard-coded/home/evonexus/evo-nexuswithSCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"so the same script works for any service user at any path. Fixes silent systemd failure where the unit reportedactive (exited)but no processes were running — triggered whenSUDO_USERwas set to something other than the auto-createdevonexususer (typical VPS pattern: clone into/root/*whileSUDO_USER=ubuntuis preserved bysudo -i).install-service.shno longer regeneratesstart-services.shvia heredoc; justchmod+chownthe checked-in version. Addedmkdir -p logsandcd ... || exit 1guards so fresh installs and dir-less reboots fail loudly instead of silently running from the wrong cwd.
- Frontend i18n — pt-BR, en-US, es (#24) —
react-i18next+ three locale bundles with 539 structurally identical keys each (validated via AST walker). Sidebar, Setup wizard (every label + validation string, live-switches as the user picks a language on step 1), Login, Settings, and 25+ page headers (Overview, Agents, Skills, Memory, Heartbeats, Goals, Providers, Integrations, Backups, Issues, Audit, Costs, Roles, Reports, MemPalace, Systems, Templates, Scheduler, Routines, Tasks, Knowledge layout, Knowledge Settings, API Keys, Connections) now render in the workspace's chosen language. Resolution order:workspace.language(backend) →localStorage.evo_lang→navigator.language→en-USfallback. Legacy codes (ptBR,pt_BR,pt,enUS,en_US) normalize to canonical BCP-47 transparently on both frontend and backend. dashboard/frontend/.npmrc—legacy-peer-deps=truesomake dashboard-appinstalls cleanly despitei18next@24/react-i18next@15declaringtypescript@^5as peer while the frontend is on TS 6.
- Backend UTF-8 everywhere — every Python I/O path that persists or reads user-facing content now uses explicit
encoding="utf-8":workspace.yaml+CLAUDE.md(auth_routes),.enveditor (config),routines.yaml(goals, scheduler),triggers.yaml,heartbeats.yaml, ADW script docstring parsing, secret key file, port read, and Knowledge CLI env round-trip. Flask JSON responses emit real UTF-8 (ensure_ascii = False,Content-Type: application/json; charset=utf-8) instead of\uXXXXescapes. Accented content (João,Leilões) now survives on Windows + Docker slim (locale=C) without mangling. settings.py—_normalize_language— transparent BCP-47 normalization onGETandPUT /api/settings/workspaceso legacyptBRin existingworkspace.yamlpromotes topt-BRon read and canonicalizes on write. Alias lookup is case-insensitive (matches frontend's/^ptBR$/i).setup.py— default language is nowpt-BR(BCP-47) instead of legacyptBR. Matches the canonical form used by the UI.auth_routes._save_workspace_config— default language fallback changed from"en"to"pt-BR", aligned with setup.py and frontendDEFAULT_LOCALE.
- i18n resolver chain empty at runtime —
LanguageDetector+supportedLngs+nonExplicitSupportedLngs+load: 'currentOnly'combination lefti18n.languages = []even with resources and language correctly loaded, sot()andexists()returned raw keys. Resolve the locale synchronously inline (localStorage → navigator.language → default) and pass it toinit({ lng }). Dropi18next-browser-languagedetector— its job is now done inline. - Scheduler — duplicate firings — removed the
_run_schedulerthread embedded inapp.pythat was running alongside the standalonescheduler.pyprocess, causing every routine to fire 2-3× per trigger. Kept a lightweight_poll_scheduled_tasksthread for one-offScheduledTaskDB entries only. - Scheduler — atomic PID lock — replaced TOCTOU-prone check-then-create with
O_CREAT|O_EXCLatomic open. Prevents multiple schedulers from starting simultaneously during rapid restarts (was causingreview-todoist/git-syncto fire multiple times and send duplicate Telegram messages). - Dashboard
restart-all—pkillprocesses directly then re-runstart-services.shinstead ofsystemctl restart(which onType=oneshot+KillMode=nonedidn't reliably kill children). Works without sudo. - Heartbeat prompt passing — pass prompt as positional arg instead of
-pflag. Claude CLI has no-pflag; the YAML frontmatter (---) was being interpreted as an unknown CLI option, failing all heartbeats withunknown option '---\nname: "zara-cs"'. fin-daily-pulse— convert all Stripe amounts to BRL (USD/IDR→BRL via exchangerate-api with 5.75 fallback); fix churn to usecustomer.subscription.deletedevents with full pagination; unify Telegram to a singlereply()call per run.prod-good-morning/prod-end-of-day— replace sub-skill calls (/gog-email-triage,/prod-review-todoist) with direct Gmail MCP / Todoist calls, eliminating 2× Telegram notifications per run.pulse-faq-sync— explicit instruction to send exactly ONE Telegram per run.
- Gemini embedder for Knowledge Base (#22) — third embedder provider alongside
local(MPNet) andopenai. Supports two models:gemini-embedding-001(stable, text-only, 2048-token input, acceptstask_type) andgemini-embedding-2-preview(multimodal, 8192-token input). Uses Matryoshka Representation Learning (MRL) with selectable output dim: 768 (default, aligns with local storage cost), 1536, or 3072. L2-normalizes client-side for dim < 3072 per Google's embedding docs. Lazy SDK import — no cost when the provider is inactive. Free tier available at aistudio.google.com/apikey. - Auto-generated
KNOWLEDGE_MASTER_KEY(#23) — the Fernet key required by the Knowledge Base is now generated automatically duringmake setup(interactive wizard) and on Docker first boot (entrypoint.sh), matching the UI-first philosophy already used forEVONEXUS_SECRET_KEY. Fresh installs get Knowledge working out of the box, no manualmake init-keyrequired. Idempotent — existing keys are preserved. The CLIevonexus init-keyis still available for legacy/rotation flows.
BaseEmbedder.embed()accepts optionaltask_type— providers that support task hints (Geminigemini-embedding-001) useRETRIEVAL_DOCUMENTduring ingestion andRETRIEVAL_QUERYat search time. Local (MPNet) and OpenAI ignore the parameter silently for API parity. Backward-compatible via defaulttask_type=None.- Knowledge settings endpoint (
PUT /api/knowledge/settings) — now validates Gemini keys against Google AI Studio'sAIzaSy...pattern, enforces MRL dim allowlist ({768, 1536, 3072}), and model allowlist for both Gemini models. Inherits CSRF guard + audit log from v0.25.0 hardening. .gitignore— cover runtime databases at repo root (*.db,*.db-shm,*.db-wal) and the fulldashboard/data/directory (previously onlydashboard/data/*.dbliteral files were ignored, missing subdirs likemempalace/,knowledge/,openclaude.db).
Settings.tsx— removed unusedproviderNeedsKeyvariable that was breakingtsc --noEmitsince the Gemini PR landed.
docs/dashboard/knowledge.md— first-time setup now reflects auto-generated master key; embedder section lists all three providers (local, openai, gemini) with their dims and use cases.docs/reference/env-variables.md— new "Knowledge Base (pgvector)" section documentingKNOWLEDGE_MASTER_KEY,KNOWLEDGE_EMBEDDER_PROVIDER, OpenAI/Gemini keys, MRL dim selection, and parser choice.
- Knowledge Base feature — full multi-tenant vector knowledge system on Postgres + pgvector. Users bring their own Postgres (Supabase, Neon, RDS, on-prem); EvoNexus is client-only, no Docker or infra provisioning.
- 1-click "Connect & Configure" wizard (
/knowledge/connections) — validates Postgres ≥14, pgvector ≥0.5, detects pgbouncer transaction pooling (blocks with HTTP 422 + actionable message), runs Alembic migrations, applies schema (8 tables includingknowledge_classify_queue). - Fernet-encrypted credential storage — DSN ciphertext at rest via
KNOWLEDGE_MASTER_KEY(bootstrap:evonexus init-key). API responses mask passwords as***. Audit trail on settings mutations (who changed which keys, IP, timestamp — values never logged). - Hybrid search — dense (pgvector HNSW) + sparse (Postgres FTS
plainto_tsquery('portuguese')) fused via Reciprocal Rank Fusion, with metadata boost percontent_type(faq=1.20, lesson=1.10, reference=1.00). Shipped as default, not opt-in. - Two embedders — local (multilingual MPNet, 768 dim) and OpenAI (1536 / 3072 dim depending on model —
text-embedding-3-small,text-embedding-3-large,text-embedding-ada-002). Provider locked once first connection is configured; changing requires full reindex (reindex endpoint deferred to v0.25.1). - Document intelligence async — upload returns
status=readyimmediately after parse+chunk+embed; classification (content_type,difficulty_level,topics) runs in a separate worker fed byknowledge_classify_queuewithFOR UPDATE SKIP LOCKED. Classification uses theclaudeCLI subprocess (same runner pattern as heartbeats) — no direct LLM API keys required. Disabled path logs warning once (UI badge deferred to v0.25.1). - Marker parser — PDF, DOCX, PPTX, XLSX, HTML, EPUB with OCR. Lazy-loaded (~500 MB model download on first install via
POST /api/knowledge/parsers/install). PlainText parser covers.md,.txt,.csv,.json. - Public API
/api/knowledge/v1/*— Bearer-token auth viaknowledge_api_keysscoped byconnection_id+space_ids; plus internal path viaDASHBOARD_API_TOKENwhich bypasses rate limit. - Rate limiter — fixed-window UPSERT (
date_trunc('minute', now())). Trade-off accepted: boundary burst can reach 2× limit across adjacent windows. Returns HTTP 429 withRetry-Afterheader. - 6
knowledge-*skills —knowledge-query,knowledge-summarize,knowledge-ingest,knowledge-browse,knowledge-organize,knowledge-admin. Integrated in 7 agents (mentor, zara, nex, mako, flux, lumen, clawdia). Note:knowledge-reindexdeferred to v0.25.1 — manual workflow today is TRUNCATE chunks + re-upload. - UI — full Knowledge section in dashboard (
/knowledge/*): connection switcher in top-bar, Connections list + wizard + detail, Spaces, Units (reorder), Browse, Search, Upload, API Keys, Settings (embedder + OpenAI key + parser).
- LLM providers removed from
/integrations— Anthropic, Gemini, Voyage, LlamaParse, OpenAI cards were cut. Agents and classifiers now use theclaudeCLI as the unified runner (subprocess), so users no longer configure provider API keys at the workspace level. OpenAI remains available, but scoped to the Knowledge embedder and configured inline at/knowledge/settings. - Dynamic embedder dimension — migration 001 resolves
vector(N)size fromKNOWLEDGE_EMBEDDER_PROVIDER+KNOWLEDGE_OPENAI_MODELat runtime instead of hardcoding 768. Fixes dimension-mismatch errors when switching to OpenAI (1536/3072) on a new connection.
- CSRF protection added to all session-authenticated write endpoints (POST/PUT/PATCH/DELETE) on Knowledge, Knowledge-proxy, and Integrations blueprints — requires
X-Requested-With: XMLHttpRequestheader. Pairs withSESSION_COOKIE_SAMESITE=Strictand restricted CORS allowlist (localhost:5173). Bearer-auth requests are exempt. Breaking change for API clients: curl or SDK scripts hitting session-authed endpoints must now sendX-Requested-With: XMLHttpRequest. - Audit log on credential mutations —
update_settingsandcreate/update/delete_custom_integrationwrite toAuditLogwith user/action/resource/IP/timestamp. Secret values are never logged; only the set of keys that changed.
Popen()doesn't acceptinput=kwarg — stdin write/close pattern.- Units schema alignment;
CAST(:x AS jsonb)instead of:x::jsonbshortcut; tags array type. - Connection-scoped navigation; connection switcher filtering all pages.
get_dsn()now accepts eitheridorslug— public/v1/*endpoints that receive the slug as connection id no longer raiseKeyError.list_documentsaggregateschunks_countandpages_countviaLATERAL JOIN— Browse UI no longer shows—for every row.
- Embedder provider change requires manual reindex (TRUNCATE chunks + re-upload). Automated reindex endpoint +
knowledge-reindexskill deferred. - Classify worker silently disabled when no
claudeCLI present — logs warning once; UI badge deferred. pages_countinlist_documentsreturns0(notnull) for documents without page metadata (markdown, txt).- Model→dim mapping is duplicated across 4 modules — tech debt to consolidate.
- Test suite requires cwd=
dashboard/backend/orPYTHONPATH=.to run end-to-end. - Search p95 at 10k+ chunks not load-verified in this release; target 500ms is architectural.
routes/providers.pywrite endpoints (pre-existing since v0.24) lack CSRF/audit — flagged in release critique, addressed globally in v0.25.1 viabefore_app_request.
- Knowledge v2 (Smart Ingest + Agentic RAG) — LLM-enhanced pre-parse classification, normalization, per-chunk enrichment (summary, questions_answered, entities, topics), semantic chunking, and an agentic retrieval loop (query rewrite + coverage evaluation + re-retrieval with max 1 retry). Separate feature folder:
workspace/development/features/knowledge-v2/(Discovery complete).
- Voyage embedder (hidden from UI; not implemented).
- LlamaParse image parser routing in upload pipeline (module exists, not wired).
- Per-space chunking config override.
- Re-ranker (Cohere / Voyage Rerank).
@librarianagent.- URL crawl ingestion.
- Document versioning.
- Access rules enforcement (stored but not applied).
- Docker Swarm / Portainer / Traefik deployment path — new production overlay with
Dockerfile.swarm,Dockerfile.swarm.dashboard,evonexus.stack.yml,entrypoint.sh,start-dashboard.sh, GitHub Actions workflow to publish images to ghcr.io, and fullREADME.swarm.mdguide. 100% additive: VPS bare-metal (make setup) and local Docker Compose paths are untouched. UI-first configuration — zero secrets baked in; everything configured via the dashboard after first boot. Services that needANTHROPIC_API_KEYwait in a 30s polling loop instead of crash-looping (PR #13 by @NeritonDias). - Dedicated
codex_authprovider for Codex OAuth — split from the API-keyopenaiprovider. Codex OAuth now requires OpenClaude ≥0.3.0 and uses model aliases (codexplan/codexspark) to route to the Codex backend. Setting a rawgpt-5.xmodel name bypasses OAuth and falls back to chat-completions — the new provider entry and env-var defaults prevent that silent failure. Bilingual (EN + PT-BR) provider guide atdocs/providers/codex-oauth.md(PR #12 by @NeritonDias). - Live model discovery for OpenAI provider — dashboard Providers page now calls
GET /v1/modelswith the user's API key, filters coding-relevant models, and renders them in a typed combobox with debounced validation. No more copy-pasting model names from docs (PR #12). - OpenClaude 0.3.0+ enforced across install surfaces —
setup.py,cli/bin/cli.mjs, and the Docker image all install / upgrade@gitlawb/openclaude@latest. Service user (evonexus) also gets OpenClaude under~/.localduring systemd setup (PR #12).
pip install -e ./npx @evoapi/evo-nexusno longer crash withEOFError—setup.pynow detects pip build-backend context viaEVO_NEXUS_INSTALL=1+ narrow argv markers (egg_info,dist_info,bdist_wheel,--editable) and exposes proper package metadata viasetuptools.setup()withfind_packages()instead of running the interactive wizard. Version is read frompyproject.toml(single source of truth) instead of being hardcoded (PR #11 by @ricardosantisinc, refined in PR #12).- Scheduler no longer starts duplicate instances on rapid restarts — atomic PID lock using
O_CREAT | O_EXCLreplaces the TOCTOU-prone check-then-create pattern. Prevents double-firing of routines (review-todoist, git-sync) and duplicate Telegram messages. restart-allin the dashboard actually restarts everything — replaced unreliablesystemctl restart evo-nexus(broken byType=oneshot + KillMode=none) with directpkillof the known processes followed bystart-services.sh. Works without sudo.- Heartbeats stopped failing with
unknown option '---\nname:...'— Claude CLI has no-pflag; the prompt (which starts with YAML frontmatter---) was being parsed as a CLI option. Now passed as a positional argument with--output-format json.
int-evo-crmpipeline_items crashed on list responses —evo_crm_client.py'scmd_pipeline_itemsassumeddatawas always a dict with apayloadkey, but the API returns{"data": [...items...]}(a list) when--stage_idis passed. Calling.get()on the list raisedAttributeError: 'list' object has no attribute 'get'and broke any agent that filtered by stage. Now handles both shapes.
TELEGRAM_CHAT_IDfield in the Telegram integration card — dashboard Integrations page now exposesTELEGRAM_CHAT_IDas an optional field alongsideTELEGRAM_BOT_TOKEN, matching.env.example. Used as the default chat/group destination for notifications.
dev-skillifyrepurposed to scaffold custom skills — previously a retrospective "conversation → skill" capture tool (role now covered bydev-learner). The skill now follows the same interactive pattern ascreate-agent/create-routine: interview → generate.claude/skills/custom-{slug}/SKILL.mdwith frontmatter, workflow, anti-patterns and verification. Same filename, new purpose.
- Installer clone is ~10x faster —
npx @evoapi/evo-nexusnow performs a shallow clone (--depth=1), cutting the download from ~454 MiB of pack data to roughly 30–50 MiB. The repo history carries ~272 MiB of superseded avatar PNGs that end users don't need for installation. Update path also switched togit fetch --depth=1+git merge --ff-only origin/<branch>to stay shallow-safe across updates while still surfacing conflicts on local modifications instead of silently discarding them.
- Chat message rewind + inline edit — hover over a previous user message and click the pencil to turn it into an inline textarea (Esc cancels, Cmd/Ctrl+Enter commits). Committing truncates the conversation at that point and starts a fresh Agent SDK session, so the model genuinely forgets the rewound turns. JSONL persistence stays append-only: rewinds are recorded as
{type:"rewind", at:<uuid>}markers applied at read time. Legacy messages without uuids get synthesized deterministic ids on load — zero disk migration (PR #10 by @gomessguii). - Copy button on chat messages — hover-revealed icon on user and assistant messages copies the text to clipboard with a brief check-icon confirmation. Assistant copy concatenates text blocks and skips tool_use cards (PR #10 by @gomessguii).
- Message uuids across the stack — stable ids now flow through frontend, in-memory session cache, and persistent JSONL logs. Required for rewind; unlocks future features (reactions, per-message pins, etc.).
- Paste screenshots from clipboard into chat — Cmd/Ctrl+V on the chat textarea now captures images from the clipboard and routes them through the existing file-attachment pipeline. Pasted images get a
pasted-{ts}.{ext}filename. Plain-text pastes keep the default browser behavior unchanged (PR #9 by @gomessguii).
- Subagent tool list inside Agent card — when an agent spawns a subagent (via the
Agenttool), the chat card now shows aN toolsbadge in the header and, when expanded, lists every tool the subagent ran (icon + name + 60-char input preview,max-h-80with auto-scroll). Original JSON input moved behind a "View input" toggle. Uses the SDK'sparent_tool_use_idto associate child tool calls with the parent Agent block.
- TodoWrite renders as checklist in chat — instead of a JSON dump, the chat now shows ○ pending / ◐ in_progress / ● completed (with strikethrough for done items) plus a
N/M donecounter in the card header. Falls back to the generic JSON view if the input is malformed.
- Trust mode is re-read on every tool call — toggling Settings → Trust now takes effect immediately for ongoing chat sessions, no restart needed. Previously the value was snapshotted at session start.
- Trust mode — new toggle in
/settings→ Trust. When ON, agents auto-approve all tool calls (Write/Edit/Bash/Agent) without prompting. Persists inconfig/workspace.yamlunderchat.trustMode. Backend endpointsGET/PATCH /api/settings/chat; terminal-server reads the flag at every session start and short-circuits bothcanUseToolandPreToolUsehook. OFF by default.
- Custom integrations configurable via drawer — custom integrations now open the same configuration drawer as core ones, so their env keys and metadata are editable directly from the dashboard.
- Preserve SKILL.md body on custom integration PATCH — editing a custom integration via PATCH no longer clobbers the hand-written body of its SKILL.md. Only the frontmatter metadata is rewritten.
- Right-click context menu on chat sessions — Rename (inline edit), Archive/Unarchive, Delete (with confirm). Archived sessions collapse into a "Arquivadas" footer section at the bottom of the list; section is hidden entirely when there are no archived entries. New
PATCH /api/sessions/:idendpoint accepts{name?, archived?};archivedfield persists tosession-store.js.
- Per-tool approval flow in chat — Read/Glob/Grep/WebFetch/WebSearch/ToolSearch run silently; Write/Edit/Bash/NotebookEdit/Agent prompt the user via inline Allow/Deny cards. Approval now covers subagents too (spawned via the Agent tool) via
PreToolUsehook, not only the main thread. - Global notification bell (topbar/sidebar) — live WebSocket channel broadcasts
agent_awaitingandagent_finishedevents from ANY session. Bell icon shows unread count, dropdown lists pending interactions, clicking navigates to the correct session. Persists to localStorage; auto-dismisses when you visit the origin session. Also updates tab title, favicon red-dot, per-session sidebar pulse, and OS notifications when tab is hidden. - Custom Integrations — Integrations page now separates "Core" and "Custom" sections. Custom integrations live at
.claude/skills/custom-int-{slug}/SKILL.md(gitignored). New UI: "+ Add custom integration" modal with fields for display name, slug, category, description, and env keys (name + value password inputs; values are upserted to.envatomically, names go to SKILL.md). Edit/delete supported via hover buttons on custom cards. create-integrationskill — guides the creation of a custom integration through interview →evo.post("/api/integrations/custom", ...).- Heartbeat costs in Costs page —
/api/costsnow includesby_heartbeataggregation and updates total KPIs. New "Per Heartbeat Breakdown" table. - Bling and Asaas — added as core integrations (previously missing from the hardcoded list).
- "Powered by EvoNexus" footer links to evonexus.evolutionfoundation.com.br in shared-workspace views.
- Backup collection strategy —
backup.pycollect_files()now uses a dynamic filesystem walk ofworkspace/andmemory/instead of relying only ongit ls-files --ignored. Sub-directories containing their own.git(workspace/projects/*) are treated as sub-repos and skipped. Captures files that the UI drops intoworkspace/project/that the git rules didn't list as ignored. - Licensing and WhatsApp — moved from hardcoded core to custom integrations (they live as
custom-int-licensingandcustom-int-whatsappskills, so they appear in the Custom section automatically). - Notification icons — replaced emoji with lucide-react icons throughout the notification bell.
- Heartbeat datetime columns on Python 3.10 —
created_at/updated_at/started_at/ended_at/consumed_atin Heartbeat tables changed fromdb.DateTimetodb.String(30). The runner inserts ISO strings with trailingZ, which Python 3.10fromisoformat()rejects (fixed in 3.11). Prod was throwing 500 on/api/heartbeats. No schema migration needed — SQLite is dynamically typed.
- Heartbeats — proactive agents with 9-step protocol — agents wake on a schedule (interval, manual, new_task, mention, approval_decision), check state, and decide whether to act. Config in
config/heartbeats.yaml, CRUD via/schedulerUI orcreate-heartbeat/manage-heartbeatsskills. Atomic checkout prevents double-runs; janitor auto-releases stale locks. See.claude/rules/heartbeats.mdanddocs/heartbeats.md. - Goal Cascade — Mission → Project → Goal → Task — 4-level hierarchy with SQLite triggers that auto-progress goals when tasks are marked done. Goals support
count/currency/percentage/booleanmetric types. Context is auto-injected into agent prompts whengoal_idis set on a routine, heartbeat, or ticket. UI at/goals. See.claude/rules/goals.mdanddocs/goals.md. - Tickets — persistent work threads with atomic checkout — assignable tickets with 6-state workflow (open → in_progress → blocked → review → resolved → closed), comments, activity log,
@agent-slugmentions that wake heartbeats. Tickets feed the agent inbox in heartbeat step 3. UI at/issueswith filters, search, bulk actions. See.claude/rules/tickets.mdanddocs/tickets.md. - SDK client for internal API (
dashboard/backend/sdk_client.py) —EvoClientsingleton that auto-resolves base URL fromEVONEXUS_API_URL→FLASK_PORT→localhost:8080and auto-injectsAuthorization: Bearer $DASHBOARD_API_TOKEN. Skills usefrom dashboard.backend.sdk_client import evoinstead of hardcoded curl — works in dev, nginx, and production without changes. - Auto-bind session to created ticket — when an agent creates a ticket inside a chat session, the terminal-server detects the POST
/api/ticketsresponse in tool_result output and auto-binds the ticket to the session. Chip in the chat header updates live via WebSocketticket_boundevent. Supports JSON and Python-repr output formats. - Ticket source attribution —
source_agentandsource_session_idcolumns on tickets. Terminal-server injects a## Runtime contextblock into the agent's system prompt with the current agent slug and session id; skills pass them through so the ticket records provenance. Timeline renders "created this ticket via @agent (session #xxxx)"; ticket header has a "Source" field. - Slash-command autocomplete in chat — typing
/opens a popup filtered by substring match on skill name, with↑↓navigation,Enter/Tabto insert,Escto close. Mirrors Claude Code terminal UX. - 7 new creation/management skills —
create-ticket,create-goal,create-heartbeat,manage-heartbeats,create-agent,create-command,create-routine,schedule-task,trigger-registry,workspace-share,initial-setuprefactored to useEvoClient. - 19 engineering agents from oh-my-claudecode —
apex-architect,bolt-executor,lens-reviewer,hawk-debugger,grid-tester,oath-verifier,compass-planner,raven-critic,zen-simplifier,vault-security,echo-analyst,trail-tracer,flow-git,scroll-docs,canvas-designer,prism-scientist,scout-explorer,probe-qa,quill-writer+ 2 native (helm-conductor,mirror-retro). Total agent count: 17 business + 21 engineering. See NOTICE.md. - Sessions sidebar badge — chat sessions bound to a ticket show a
🎫 #xxxxxxxxchip next to the session name.
- Agents have no
skills:frontmatter block — all 38 agents see the full skill catalog dynamically. Adding a new skill no longer requires editing frontmatter across agents. - Skill index auto-discovered —
.claude/skills/CLAUDE.mdnow lists 175+ skills organized by prefix (dev-,fin-,hr-,int-,legal-,mkt-, etc.).
config/heartbeats.yamladded to.gitignore— user heartbeat config no longer accidentally committed.
- PDF preview in workspace — PDFs were downloading instead of rendering inline. Added
?inline=1parameter to the download endpoint that serves withContent-Disposition: inlineinstead ofattachment
- Flask survives systemd restart —
pkillpattern changed fromdashboard/backend.*app.pytopython.*app.py. Thecd dashboard/backendchanges CWD but the process cmdline stayspython app.py, so the old pattern never matched and Flask kept running with stale code across restarts
- Chat connection error feedback — when terminal-server is offline, the chat UI now shows a red error pill instead of sitting silently. HTTP preflight check before WS connect, disabled input while connecting/errored,
cancelledflag for clean unmount (PR #7 by @gomessguii) - Terminal-server IPv4 bind — explicit
0.0.0.0host so WSL2 localhost forwarding reaches the server from Windows browsers (PR #6 by @gomessguii)
- File tab context menu — right-click on workspace file tabs for: Close, Close others, Close all to the left, Close all to the right, Close all
- Scheduler in systemd —
start-services.shandExecStopnow manage the scheduler process. Restarts properly kill and relaunch the scheduler soroutines.yamlchanges take effect
- Licensing product slug — changed
PRODUCTandTIERfrom"evonexus"to"evo-nexus"to match the licensing server's product registry. This was causing 400INVALID_TIERon new installations - Licensing error logging —
_post()now logs the server's error body (e.g.,MISSING_FIELD: email is required) instead of the generic400 Bad Request - Setup requires email — the initial setup endpoint now validates that email is provided (required for license registration)
- Auto-register skips missing email —
auto_register_if_needed()no longer attempts registration if the admin user has no email - Makefile pkill self-kill — applied
[p]atternbracket trick to preventpkill -ffrom matching its own shell process on Linux/WSL (PR #5 by @gomessguii)
- Durable chat history via JSONL logs — chat messages are now append-only logged to
ADWs/logs/chat/{agent}_{session}.jsonl. On session join, if the in-memory history is empty (e.g., after server restart), the JSONL log is read and restored automatically. This makes chat history survive restarts,sessions.jsoncleanups, and 7-day expiry
- Image generation cost estimates — each image in the Costs page now shows an estimated USD cost based on model pricing (Gemini Flash $0.039/img, FLUX.2 $0.03/img, GPT-5 Image $0.04/img, etc.). Total image cost shown in section header and included in the "Total (All)" KPI card
- Workspace folder permissions — roles can now restrict access to specific workspace folders (finance, marketing, personal, etc.). Three modes: All, Selected (checkbox grid), None. Admin always bypasses. Enforced on all workspace browser endpoints: tree, read, write, create, rename, delete, upload, download, recent, and file share creation
- Role editor UI for folder access — Settings → Roles now has a "Pastas do Workspace" section with radio buttons for mode and a dynamic checkbox grid that scans existing folders from disk
- Dynamic folder scan endpoint —
GET /api/roles/workspace-folderslists all top-level directories underworkspace/without hardcoding - SendMessage tool card — chat UI now renders
SendMessagetool calls with subagent avatar and description, same as Agent tool cards
- SQLite auto-migration — added
ALTER TABLE roles ADD COLUMN workspace_folders_jsontoapp.pystartup migration, preventing crash on existing databases - Chat textarea height — input area resets to single line after sending (carried over from v0.19.1)
- Subagent cards in chat — when an agent delegates to another (e.g., Oracle → Sage), the tool card shows the subagent's avatar, name with
@, description, live progress summary, and completion status - Subagent progress summaries — enabled
agentProgressSummariesin the SDK so subagent activity is streamed in real-time - Chat UI screenshot — added
print-chat.webpto README, site screenshots carousel, and i18n (en/pt-BR/es)
- Textarea height reset — Shift+Enter expanded the input area but it did not shrink back after sending. Now resets to single line on send
- Agent SDK dependency — added
npm installstep to production deploy (the SDK was listed in package.json but not installed on the server)
- Chat UI for agents — new chat mode alongside the terminal on every agent page. Uses the Agent SDK (
query()) with structured streaming: text deltas, tool use cards, thinking indicator. Messages persist across page refreshes via server-sidechatHistorystored in session-store - Chat session management — sidebar "Sessions" tab shows all conversations for an agent with preview of last message, sorted by most recent. Create new sessions, switch between them. Each session maintains its own SDK conversation context
- Agent identity in chat — chat mode loads the agent's
.claude/agents/{name}.mdsystem prompt viasystemPrompt.appendon the Claude Code preset, so agents (Oracle, Clawdia, etc.) respond in character - File attachments in chat — attach images via paperclip button or drag-and-drop. Files are base64-encoded, saved to temp dir on server, and referenced in the prompt so the agent can
Readthem - Restart All button — Scheduler page now has a "Restart All" button that triggers
systemctl restart evo-nexusvia a new/api/services/restart-allendpoint (systemd deployments only)
- Chat event routing — fixed duplicate
typekey bug in server.js where{ type: 'chat_event', ...msg }spread overwrote the envelope type with the inner message type, causing the frontend to silently drop all chat events - Session persistence —
chatHistoryandsdkSessionIdare now included in session-store serialization/deserialization so chat conversations survive server restarts
- Multi-terminal tabs per agent — each agent page now supports multiple terminal sessions with a tab bar. Create new terminals with the
+button, switch between them, and close sessions individually. Backend addsGET /api/sessions/by-agent/:nameandPOST /api/sessions/createendpoints - Recent Agents section — the Agents page shows the last 6 visited agents at the top for quick access, with avatar, name, command, and running indicator. Tracked via localStorage
- systemd KillMode=none — nohup background processes (Flask, terminal-server) were being killed when the oneshot ExecStart script finished.
KillMode=noneprevents systemd from sending SIGTERM to child processes - install-service.sh regenerates start-services.sh — the copied script had hardcoded
/root/paths from the original installation, causingPermission deniederrors when running as theevonexususer
- Dedicated
evonexususer + systemd service — VPS setup (is_remote=Trueas root) now automatically creates a dedicated system user, installs uv + Claude Code for it, and configures a systemd service (evo-nexus) that auto-starts on boot. Solves the Claude Code restriction that blocks--dangerously-skip-permissionsas root install-service.sh— standalone script to install the systemd service on existing installations (sudo bash install-service.sh). Safe to re-run- CLI update mode uses systemd —
npx @evoapi/evo-nexus .now detects the systemd service and usessystemctl restartinstead of callingstart-services.shdirectly. Syncs files to the service directory when they differ
- systemd service type — uses
Type=oneshotwithRemainAfterExit=yessincestart-services.shlaunches background processes withnohup
- Share viewer CSS isolation — shared HTML files now render inside an
<iframe>withsrcDocinstead ofdangerouslySetInnerHTML, preventing Tailwind preflight and global dashboard styles from overriding the shared file's internal CSS (e.g., centered headers appearing left-aligned) - Workspace file manager responsiveness — FileTree sidebar now collapses into a slide-over drawer on mobile (
<lgbreakpoint) with overlay and toggle button. Toolbar buttons show icons-only on small screens (<sm). Selecting a file auto-closes the sidebar on mobile - Makefile
make runIndentationError — multiline Python-ccommands had tab characters from Makefile indentation leaking into the Python source, causingIndentationError: unexpected indent. Collapsed to single-line commands
- Backup retention & auto-cleanup — configurable via
BACKUP_RETAIN_LOCALandBACKUP_RETAIN_S3env vars (also editable in dashboard Storage Provider panel). Old backups beyond the limit are auto-deleted after each backup run boto3as default dependency — included inpyproject.tomlso new installs have S3 support out of the boxtrigger-registryandscheduleskills — added to Oracle and Clawdia agents so they can create/manage webhook triggers and scheduled tasks
- S3 backup is now S3-only — when S3 is configured, daily routine and
make backup-s3upload to S3 and delete the local copy. Local backup is fallback only when S3 is not configured - Dashboard restore runs post-migrate — restore via the web UI now auto-fixes schema differences (missing columns, corrupted datetimes) after extracting, preventing 500 errors from old backups
make restorestops/restarts services — restore now kills Flask and terminal-server before extracting, then restarts viastart-services.shafter. Prevents SQLite lock conflicts and ensures auto-migrate runs on the restored database- Setup prompt clarified — "Type 1 or 2" instead of "Choice" for Dashboard Access, rejects invalid input with clear message
- SQLite auto-migrate fixes corrupted datetime columns — on startup, Flask now detects and repairs NULL or non-string
created_atvalues inrolesanduserstables. Prevents crash after restoring a backup from an older version
- CLI update mode —
npx @evoapi/evo-nexus@latest .now detects existing installations and runs pull + rebuild + restart instead of failing with "directory already exists". Stops services before pull, rebuilds frontend, restarts viastart-services.sh - Backup import — new "Importar" button in Backups page to upload external
.zipbackup files into the local backups list. Validates ZIP integrity before accepting - S3-compatible storage support — added
AWS_ENDPOINT_URLandBACKUP_S3_PREFIXfields to the backup Storage Provider config panel for Cloudflare R2, Backblaze B2, MinIO, and any S3-compatible provider
npx @evoapi/evo-nexus .on existing repo — no longer crashes with "fatal: destination path '.' already exists". Auto-detects.git+pyproject.tomland switches to update flow- S3 client for non-AWS providers — boto3 client now uses
AWS_ENDPOINT_URLwhen set, enabling R2/Backblaze/MinIO connectivity
make uninstall— full cleanup command that stops services, removes nginx config, data, deps, and config files. Requires typing "UNINSTALL" to confirmmake stop— stops all EvoNexus services (dashboard + terminal-server)
- Setup nginx config not persisting — now removes both
defaultanddefault.conf, usessystemctl reloadinstead ofstart, shows clear error with fix command ifnginx -tfails - CLI showing wrong instructions for VPS —
npx @evoapi/evo-nexusnow detects remote mode (nginx config present) and shows./start-services.shinstead ofmake dashboard-app. Skips redundant frontend build when setup already built it - CLI redundant
npm run build— no longer rebuilds frontend after setup already did, avoiding "port already in use" cascade when services were already running
- AI Image Creator cost tracking in dashboard — new "Geração de Imagens" section in Costs page showing per-image model, provider, tokens, size, and elapsed time with totals
- Image costs API endpoint —
GET /api/routines/image-costsreads cost entries fromADWs/logs/ai-image-creator-costs.json
- AI Image Creator costs path — cost logs now saved to
ADWs/logs/ai-image-creator-costs.json(workspace-level) instead of.ai-image-creator/costs.json(project-level)
- Public share links — generate public URLs for any workspace file (HTML, markdown, images, video, audio, PDF). Token-based with configurable expiration (1h/24h/7d/30d/permanent). New
FileSharemodel,sharesblueprint, public view page with EvoNexus branding footer, and management page to list/revoke links - Media preview in workspace — video (mp4/webm/mov), audio (mp3/wav/ogg/aac/flac), and PDF files now render inline in both the workspace file manager and public share pages
- Share button in toolbar — new "Compartilhar" button in FileToolbar with modal for link generation, expiration selector, and clipboard copy
- Share Links management page — new
/sharesroute with table view showing all active links, view counts, expiration status, copy and revoke actions workspace-shareskill — conversational skill for Oracle and Clawdia to create/list/revoke share links via natural language- AI Image Creator skill — generate images via multiple AI models (Gemini, FLUX.2, Riverflow, SeedDream, GPT-5) through Cloudflare AI Gateway or OpenRouter
- AI Image Creator integration — new integration card in dashboard with env var configuration for Cloudflare and OpenRouter keys
- Integration env vars API — scoped
GET/PUT /api/config/envendpoints for reading and updating.envvariables from the integration drawer
- Setup wizard hardened —
uv sync,npm install, andnpm run buildnow check exit codes and show clear error messages with log paths instead of silently succeeding on failure make dashboard-apprunsnpm install— ensures frontend dependencies are up to date aftergit pullbefore building- AgentTerminal connection — auto-detects local vs deployed environment for terminal-server WebSocket URL (supports
localhostand127.0.0.1without reverse proxy)
- Settings page — new
/settingspage in the dashboard with three tabs: Workspace config (workspace.yaml), Routines management (routines.yaml), and Reference (CLAUDE.md, Makefile, Commands) - Workspace config UI — edit workspace name, owner, company, language (20 locales), timezone, and dashboard port
- Routines toggle & inline edit — enable/disable routines with toggle switches, edit schedules inline, grouped by frequency (daily/weekly/monthly)
- Settings backend API — 9 new endpoints for workspace and routine CRUD with audit logging and scheduler reload via sentinel file
- API patch method —
api.patch()added to frontend API helper
- Config page replaced by Settings — old
/configremoved,/configredirects to/settings - Sidebar updated — "Settings" added as first item in System group
- .env editor — removed from both frontend and backend (security risk; use terminal for .env changes)
- i18n support for landing page — English, Portuguese (BR), and Spanish with language switcher in nav. Preference saved in localStorage.
- Per-integration icons in dashboard — each integration card now shows a distinct icon and color (24 mappings: Stripe purple, Discord blue, WhatsApp green, etc.)
- Discord CTA in hero — "Join 17,000+ developers on Discord" link below main CTAs
- Evolution Foundation banner — persistent top banner linking to evolutionfoundation.com.br
- Landing page copy overhaul — new headline "Run your business with AI agents", rewritten subtitle listing business areas (finance, marketing, legal, sales, community, engineering), removed em-dashes, fixed buzzwords
- Integration count updated — 18 → 23 integrations (added WhatsApp, LinkedIn, Figma, Amplitude, Intercom, HubSpot, DocuSign, Bling, Asaas; removed Evolution API/Go/CRM from public LP)
- Skills count corrected — 150+ → 175+ across all pages and translations
- Background simplified — removed noise.svg + grid overlay, kept minimal gradient only
- Agents showcase link — "See all 38 agents" now points to /docs/agents/overview instead of broken /agents route
- Config page removed from dashboard — redundant with Integration drawer (from v0.17.0)
- Canvas agent memory files — removed from dashboard/frontend/.claude/ (wrong location)
- Lucide icon name —
Github→GitFork(Github not exported in current Lucide version)
- Multi-file tabs in Workspace — open multiple files simultaneously with a tab bar. Tabs persist in localStorage across page refreshes. Per-tab dirty state, editor content, and mode tracking. Middle-click to close, unsaved changes confirmation.
- Integration config drawer — integration cards are now clickable, opening a side drawer with integration-specific form fields (masked API keys with reveal toggle). Save writes to
.envwith safe merge. OAuth integrations show "Connect" button instead. Backend test endpoint (POST /api/integrations/<name>/test) with real connectivity tests for Stripe, Omie, Evolution API, and Todoist. - Agent-level permissions — new
agent_accessfield on roles with 4 modes: all, by layer (business/engineering), per-agent selection, or none. Locked agents appear with reduced opacity + lock icon in the dashboard. Direct URL access to locked agents shows "Acesso restrito" page. 38 agents mapped across business (17) and engineering (21) layers. - S3 backup browser — new "Remote Backups (S3)" section on the Backups page lists existing backups in the configured S3 bucket. Download directly from S3. New backend endpoints
GET /api/backups/s3andGET /api/backups/s3/<key>/download. - Backup storage provider config — collapsible "Storage Provider" panel on the Backups page with S3 Bucket, Access Key, Secret Key, and Region fields (masked with reveal toggle).
- Copy file path button — click "Copiar" in the file path bar to copy the full path to clipboard.
- Tree view preserves state on refresh — when page reloads, all ancestor folders of the selected file auto-expand to restore the navigation context.
- Config page removed — redundant with the new Integration drawer.
.envvars for dashboard credentials (DASHBOARD_API_TOKEN) are no longer editable from the frontend (security improvement). - Logo consistency — Login and Setup pages now use the official
EVO_NEXUS.pnglogo instead of a generic inline SVG.
- DB migration for agent_access — auto-migrate adds
agent_access_jsoncolumn to existing SQLite databases on startup (ALTER TABLE before seed_roles).
- Multi-provider AI support — switch between Anthropic (native Claude), OpenAI (GPT-5.x via Codex OAuth or API key), and OpenRouter (200+ models) from the dashboard. Provider toggle with on/off per provider, session blocking when none active, clean env whitelist to prevent stale API key leaks. (PR #4, @NeritonDias)
- OpenAI Codex OAuth flow — browser OAuth + device auth via dashboard endpoints (
auth-start,auth-complete,device-start,device-poll,status,logout). Tokens saved in correct Codex format (~/.codex/auth.json). - Agent persona enforcement for non-Anthropic providers —
--system-promptreplaces default prompt for GPT/Gemini so agents respond in character. - Setup hardening for VPS — auto-install prerequisites (Node.js 24.x, build-essential, uv, Claude CLI, OpenClaude), Nginx + SSL (certbot default, self-signed fallback), IPv6, firewall, proper sudo/permissions handling, service auto-start with health checks.
- YouTube Competitive Analysis skill (
social-yt-competitive) — analyze YouTube channels for outlier videos and packaging patterns. - MemPalace worker (
dashboard/backend/routes/_mempalace_worker.py) — background worker for Knowledge Base indexing.
- Complete agent-skill audit — all 38 agents now declare their skills in YAML frontmatter AND in the prompt body ("Skills You Can Use" section for engineering agents). 25/25
dev-*skills assigned to agent owners (zero orphans). Business agents expanded: Kai (+3), Sage (+3), Nex (+6), Mentor (+4), Oracle (+6), Atlas (+3). Engineering agents fixed: Raven, Zen, Vault, Trail, Scroll, Prism, Quill, Flow (+frontmatter). Orchestrators Helm and Mirror gained dedicated skill sections. - UI redesign — Setup, Login, Providers pages — canvas API neural network animated background, solid cards, no glassmorphism/sparkles, professional form UX with autocomplete, accessible toggle switches with
role="switch". - Image optimization — agent avatars PNG→WebP (271MB → 1.7MB, 99.4% reduction), docs/public screenshots PNG→WebP (67-73% reduction).
- Onboarding flow restored —
workspace-statusendpoint now checks ifownerfield is actually filled, not just if file exists. - Dead routes removed —
/chatquick actions replaced with Agents and Providers links. - Skill count bumped to 175+ across README, docs, site, rules.
- README clone instruction — added
--depth 1for faster cloning. - Providers marked as coming soon — Gemini, Bedrock, Vertex flagged with
coming_soon: true.
- Terminal server spread order —
...optionsmoved before explicit properties instartSessionto preventagentbeing overwritten withundefined. - Clean env whitelist — spawned CLI processes only inherit 22 whitelisted system vars + provider env, preventing stale
OPENAI_API_KEYleaks. - Root detection — skips
--dangerously-skip-permissionsfor root users. - uv sync as SUDO_USER —
.venvsymlinks now point to user's Python, not root's. - File ownership —
chown -R+chmod +x .venv/bin/before starting services.
- Brand refresh — new EvoNexus logo —
public/EVO_NEXUS.pngis now the canonical brand asset.public/cover.svghas the old<text>Evo Nexus</text>replaced by an embedded base64<image>of the new logo, so the README banner renders the real brand mark in any viewer without external dependencies. Copies ofEVO_NEXUS.pngalso live atsite/public/assets/EVO_NEXUS.pnganddashboard/frontend/public/EVO_NEXUS.pngso the site and dashboard can serve it directly. site/src/pages/Home.tsx— nav header — the top navigation now shows only the EvoNexus PNG logo (@assets/EVO_NEXUS.png). The legacy Evolution logo (@assets/logo.png) and the duplicate<span>Evo</span><span>Nexus</span>text that sat next to it were both removed from the header — Evolution branding remains on the case-study card and the footer where it belongs.dashboard/frontend/src/components/Sidebar.tsx— sidebar header — the two-tone<h1><span>Evo</span><span>Nexus</span></h1>heading was replaced by<img src="/EVO_NEXUS.png" className="h-8 w-auto" />, matching the new brand.- Skill count bumped to 150+ across every source of truth —
README.md(4 spots: intro bullet, Key Features list, dashboard table, folder tree),public/cover.svg(badge),.claude/rules/skills.md(header),docs/introduction.md,docs/architecture.md(ASCII diagram + evo-skills note),docs/skills/overview.md,docs/getting-started.md, andsite/src/pages/Home.tsx(4 spots: hero paragraph, stat card, feature tile, "Skills as Instructions" description). Previous counts of~137,~140,137+,~130all normalized to150+.docs/llms-full.txtregenerated viamake docs-buildto pick up the new numbers.
- Learning Loop feature — knowledge retention system based on SM-2 spaced repetition. Four skills:
learn-capture(extract 1-5 atomic facts from pasted content),learn-review(run SM-2 sessions with Again/Hard/Good/Easy grades updatinginterval/easein-place),learn-quiz(retrieval-practice question sets, read-only),learn-stats(total facts, overdue count, retention rate, active decks, facts added this week). Facts are individual markdown files inworkspace/learning/facts/with full SM-2 frontmatter (interval,ease,reps,lapses,next_review). Review history appended to.state/review-log.jsonlfor audit. All user data gitignored by default — onlyworkspace/learning/README.mdis committed. Pull-only in v0 (no Telegram push, no Fathom auto-capture — deferred). @lumen-learningagent — new business-layer agent (17th) dedicated to learning retention. Orchestrates the fourlearn-*skills and keeps separation of concerns clean:@mentor-coursescreates learning content,@lumen-learningmakes it stick. Command:/lumen-learning. Model: sonnet. Color: yellow.learning_weeklyroutine — scheduled for Sundays 09:45 BRT viaADWs/routines/custom/learning_weekly.py. Generates a markdown digest inworkspace/daily-logs/YYYY-MM-DD-learning-weekly.mdwith overdue facts and retention stats. Read-only — never mutates SM-2 frontmatter. Makefile target:make learn-weekly.- Agent avatars in the dashboard — 35 custom PNG avatars under
dashboard/frontend/public/avatar/covering all business agents (12) and 19 engineering agents (helm, mirror also now included). NewAgentAvatarcomponent renders the PNG as a circular image when available, or falls back to a colored circle with the Lucide icon when not. Integrated into the agent list cards (Agents.tsx, 56px) and the agent detail page header (AgentDetail.tsx, 60px with colored halo). - Agent count bumped across all docs — README,
docs/introduction.md,docs/agents/overview.md,docs/architecture.md,docs/real-world/evolution-foundation.md,docs/dashboard/overview.md,docs/guides/initial-setup-skill.md,site/src/pages/Home.tsx,.claude/rules/agents.md,CLAUDE.mdupdated from 37 (16 business) → 38 (17 business).public/cover.svgtext updated from37 Agents→38 Agents.
dashboard/frontend/src/lib/agent-meta.ts— expanded from 19 entries to 38. All 21 engineering agents were previously falling through toDEFAULT_META(genericBoticon, no slash command badge); each now has a dedicated entry with icon, color, command, label, and avatar path. Business agentsaria-hr,zara-cs,lex-legal,nova-product,dex-data,helm-conductor,mirror-retroalso gained theiravatarfield.AgentMetainterface extended with optionalavatar?: string.AgentDetail.tsxheader — grew fromh-14toh-20to accommodate the 60px avatar with its colored halo to the left of the agent name and command.
/api/overviewendpoint — dropped from ~16s to ~29ms (≈500× faster)._recent_reportswas rglob'ing the entireworkspace/tree, which on an active install holds vendored third-party repos underworkspace/projects/(mcp-dev-brasil, oh-my-claudecode, evoai-services, etc.) — 16.853 of 17.116 MD/HTML files (98.5%) lived there and had nothing to do with "recent reports". The scan now skips top-levelprojects/(vendored repos) andmeetings/(raw Fathom transcripts), iterates remaining areas, and formats thedatefield from the actualmtimeinstead ofpath.split("/")[-1][:10](which was returning garbage like"README.md").- Site typecheck errors —
site/src/pages/Home.tsxhad 3 lucide icons (MessageSquare,GitBranch,Database) passing an invalidtitleprop. Wrapped them in<span title="...">to keep the hover tooltip and passtsc --noEmit. - Dashboard frontend build —
dashboard/frontend/src/pages/Providers.tsxwas importingtype LucideIconwithout using it, which causedmake dashboard-appto fail withTS6133. Unused import removed. - Terminal startup garbage (WIP, 2 attempts included) — on starting any agent terminal from the dashboard, bytes like
0?1;2c/000000/^[[0^[[0...showed up in the prompt and status bar. Root cause is xterm.js auto-replying to terminal queries (DA1\x1b[c, DA2\x1b[>c, DSR\x1b[5n/\x1b[6n, window ops\x1b[...t) viaterm.onData, which the frontend was forwarding to the pty as if it were keyboard input. This release ships two defensive layers — passingcols/rowsupfront onstart_claudeso the pty is born at the right size, and registering CSI handlers viaterm.parser.registerCsiHandler({ final: 'c' | 'n' | 't' }, () => true)to intercept queries at the parser level — plus a regex filter ononDataas a second line of defense. The bug is not fully resolved in this release. Some payloads still slip through (likely via a non-CSItriggerDataEventpath that hasn't been pinned down yet). A debug log was added toAgentTerminal.tsxto capture the exact bytes in the next iteration.
- Feature folder convention —
workspace/features/{slug}/is nowworkspace/development/features/{slug}/across all engineering layer prompts (.claude/rules/dev-phases.md,.claude/agents/compass-planner.md,.claude/agents/helm-conductor.md,.claude/commands/helm-conductor.md,.claude/agents/mirror-retro.md,docs/agents/engineering-layer.md). Keeps all engineering artifacts (features, plans, architecture, reviews, verifications, retros) grouped under one development/ root.
- Multi-provider documentation — README,
docs/introduction.md,docs/getting-started.md,docs/reference/env-variables.md,docs/dashboard/overview.mdupdated with the OpenClaude-based multi-provider story introduced in v0.14.0. Newdocs/dashboard/providers.mddocuments the Providers page (supported providers, activation flow, security model with CLI + env var allowlists, logout warning). Site landing page replaces the "Full Control" feature card with "Multi-Provider, No Lock-In" highlighting the new capability.
dashboard/terminal-server/— lean terminal bridge powering the dashboard's per-agent xterm session. Fork ofvultuk/claude-code-webstripped down from ~3.500 lines / 158 npm packages to ~440 lines / 74 packages, keeping only what the dashboard consumes:POST /api/sessions/for-agent,GET/DELETE /api/sessions/:id, and a WebSocket withjoin_session/start_claude/input/resize/ping/stop. Removed codex & cursor bridges, usage analytics, auth, HTTPS, ngrok, PWA, folder browser, and the entire legacy web UI. Spawns the localclaudeCLI vianode-ptyand persists sessions to~/.claude-code-web/sessions.json. New Makefile targetsterminal-logs/terminal-stop. Apostinstallhook restores thedarwin-arm64/darwin-x64node-ptyspawn-helperexecutable bit soposix_spawnpdoesn't fail on fresh installs.make bling-auth— one-shot OAuth2 bootstrap for the Bling integration. Runs.claude/skills/int-bling/scripts/bling_auth.pyto capture the initial access + refresh tokens into.env; subsequent refreshes are automatic via the skill.- Docs — new
docs/integrations/bling.mdanddocs/integrations/asaas.mdwith endpoint coverage, auth setup, and example calls.docs/integrations/overview.mdexpanded with the two Brazilian integrations. - Frontend — new
dashboard/frontend/src/lib/agent-meta.tscentralizing the agent icon/color/command/label metadata used byAgents.tsx,AgentDetail.tsx, and the refreshedAgentTerminal.tsx.
int-blingskill — upgraded from manual v1 Bearer token to OAuth2 with automatic refresh. Access token expires in 6 hours; the skill now readsBLING_CLIENT_ID/BLING_CLIENT_SECRET/BLING_REFRESH_TOKENfrom.envand refreshes on 401, persisting the new token pair back to disk..env.exampledocuments the new variables and points tomake bling-authfor first-time setup..claude/rules/integrations.md— Bling row updated to reflect OAuth2 auto-refresh +make bling-auth. Asaas row now mentions marketplace split.dashboard/frontend/src/App.tsx,pages/Agents.tsx,pages/AgentDetail.tsx,components/AgentTerminal.tsx— refactored to consume the newagent-meta.tsmodule and the leaner terminal-server endpoints. Error messages updated fromcc-web→terminal-server.Makefile—dashboard-apptarget now bootsdashboard/terminal-server/bin/server.js --devinstead of the oldclaude-code-web/bin/cc-web.js. Helper targets renamedcc-web-logs→terminal-logs,cc-web-stop→terminal-stop..gitignore— ignoresdashboard/terminal-server/node_modules/and itspackage-lock.json.
- Terminal spawn failures on fresh installs —
node-pty'sspawn-helperprebuild was being extracted without the execute bit on macOS, causingposix_spawnp failedwhen the dashboard tried to start a claude session. Fixed by adding apostinstallscript that re-applieschmod +xon bothdarwin-arm64anddarwin-x64prebuilds.
- New skill
int-bling— Bling ERP API v3 integration. 10 operations across products (list/create), sales orders (list/create), contacts (list/create, F/J types), fiscal invoices/NF-e (list/create from orders), and stock (get/update by warehouse). Uses OAuth2 Bearer token (BLING_ACCESS_TOKEN). Schemas and endpoint coverage derived from themcp-dev-brasilTypeScript reference implementation underworkspace/projects/mcp-dev-brasil/packages/erp/bling/, complemented by developer.bling.com.br for advanced endpoints. - New skill
int-asaas— Asaas payment platform API v3 integration. 15 operations across payments (create/get/list, PIX QR code, boleto PDF), customers (create/list with CPF/CNPJ validation), subscriptions (create/list/cancel), financial (balance, transfer), marketplace (subaccount for split payments), and utilities (installments, webhook events). UsesASAAS_API_KEYheader auth withASAAS_SANDBOX=trueas safe default (sandbox.asaas.com), switchable to production. Enums documented:billingType(BOLETO/CREDIT_CARD/PIX/UNDEFINED) and paymentstatus(PENDING/RECEIVED/CONFIRMED/OVERDUE/REFUNDED/etc). Schemas derived frommcp-dev-brasil/packages/payments/asaas/with Zod validation patterns ported to the skill. .env.example— newBLING_ACCESS_TOKEN,ASAAS_API_KEY, andASAAS_SANDBOXentries under dedicated Brazilian ERP/payments sections.
.claude/rules/skills.md—int-*row bumped from 13 → 15, now listing Bling and Asaas alongside Stripe, Omie, and the other integrations.- README + docs — skill counts updated: ~138 → ~140 total (~113 → ~115 business layer).
- New skill
prod-activation-plan— canonical pattern for producing phased activation plans: single index file atworkspace/development/plans/[C]{plan-name}-{date}.md+ one folder per phase (fase-1-quick-wins/,fase-2-conexoes/,fase-3-ciclo-completo/) + one file per item with a rich template (frontmatter, axis, type, concrete steps, decisions pending, impact, dependencies, risks, suggested agent team, status checklist). Includes agent routing rules for[ATIVAR]/[DECIDIR]/[CONSTRUIR NOVO]/[EVOLUIR]item types, and an expansion mode that preserves existing items while appending new ones with a version bump in the history section. Lives at.claude/skills/prod-activation-plan/SKILL.md.
- Oracle — Step 6 rewritten to use
prod-activation-plan— Oracle no longer invents plan structures on the fly. The canonical flow is nowOracle (interview) → @compass-planner (content) → prod-activation-plan skill (structure) → Oracle (delivery). Added explicitStep 6a(delegate content to Compass),Step 6b(materialize via skill), andStep 6c(handle plan expansions preserving existing files). Oracle prompt now contains an explicit "NEVER invent your own plan structure" directive to prevent drift. - README +
docs/getting-started.md— Quick Start callout and Step 5 both point to/oracleas the first thing to run after installation, with the 7-step Oracle flow explained, the activation-plan structure documented, and the 3 autonomy paths (Guided / Autonomous / Delegated) surfaced. Skill counts bumped from ~137 → ~138 (prod-* subcategory grew from 9 → 10). .claude/rules/skills.md—prod-*row updated to includeactivation-planin the inline list and count bumped to 10.
- Dashboard — delete social account now works — the trash icon on
/integrationswas callingPOST /disconnect/{platform}/{index}, a route that only exists in the standalonesocial-authFlask app (port 8765), not in the dashboard backend (port 8080), so clicks silently 404'd. AddedDELETE /api/social-accounts/<platform>/<int:index>todashboard/backend/app.pyreusingenv_manager.delete_account, and updateddashboard/frontend/src/pages/Integrations.tsxto callapi.delete()and consume the returned{platforms}payload in a single round-trip. - YouTube — automatic OAuth token refresh —
SOCIAL_YOUTUBE_*_ACCESS_TOKENexpires after ~1h, forcing a manual reconnect through social-auth. Thesocial-authOAuth flow already requestedaccess_type=offline+prompt=consentand savedREFRESH_TOKEN, butyoutube_client.pynever used it. Added_refresh_access_token(account)that exchanges the refresh token athttps://oauth2.googleapis.com/token, persists the new access token to.env(SOCIAL_YOUTUBE_{N}_ACCESS_TOKEN) andos.environ, and made_api_getauto-retry once onHTTP 401when a refresh token is available. Transparent to all callers (skills, routines, agents). RequiresYOUTUBE_OAUTH_CLIENT_IDandYOUTUBE_OAUTH_CLIENT_SECRETin.env(already present for any OAuth-connected account).
- 2 native engineering agents — bringing the Engineering Layer to 21 agents (19 derived from oh-my-claudecode + 2 native):
helm-conductor(sonnet, teal) — cycle orchestration agent. Sequences features, decides "what next?", routes tasks to phase owners, coordinates sprint planning. Does not do the work of any phase itself; it orchestrates.mirror-retro(sonnet, silver) — blameless retrospective agent. Reads the full feature folder end-to-end at the close of a feature, sprint, or incident, and produces a structured retro with "what worked / didn't / surprises / lessons / proposed memory updates". Requires explicit user approval before writing tomemory/.
- Canonical 6-phase engineering workflow —
.claude/rules/dev-phases.mddocuments the EvoNexus development lifecycle: Discovery → Planning → Solutioning → Build → Verify → Retro. Each phase has an owner, inputs, outputs, exit criteria, and skip conditions. Includes handoff protocol, inherited-context rules, and a feature-skip matrix (typo fixes skip most phases; high-stakes migrations use all 6). - Feature folders as unit of work —
workspace/features/{feature-slug}/groups all artifacts of one feature (discovery, PRD, plan, architecture, reviews, verification, retro) in one coherent location. Coexists with the type-based folders inworkspace/development/{plans,reviews,...}/which remain the canonical location for standalone artifacts. - Oracle redesigned as consulting entry point —
@oracleis now the official entry door to EvoNexus. It runs a full 8-step flow: detect workspace state → runinitial-setupif needed → business discovery interview → delegate capability mapping to@scout-explorer→ delegate gap analysis to@echo-analyst→ present the "potential" in business language → delegate plan production to@compass-planner→ deliver with 3 autonomy paths (guided / autonomous / delegated). Oracle keeps the relationship with the user in a single voice while orchestrating specialist agents for the heavy lifting. Prime directive: the user must never be left with doubts — check-ins are mandatory before any side-effect action and after every substantive response.
@compass-plannernow produces PRD + Plan in Phase 2 — for non-trivial feature work, Compass first produces[C]prd-{feature}.md(problem, goals, non-goals, user stories, acceptance criteria in Given/When/Then, constraints, open questions) and then derives[C]plan-{feature}.mdfrom it. Trivial changes skip the PRD. Handoff chain updated: Compass → Apex (Phase 3) → Bolt (Phase 4), not directly Compass → Bolt for non-trivial work.README.md,CLAUDE.md,docs/introduction.md,docs/architecture.md,docs/agents/overview.md,docs/agents/engineering-layer.md,site/src/pages/Home.tsx,public/cover.svg— agent count updated from 35 → 37 (16 business + 21 engineering). Engineering layer descriptions mention the 2 native additions (Helm, Mirror) and the 6-phase workflow..claude/rules/agents.md— Engineering Layer bumped to 21 agents. Helm and Mirror marked with ⭐ as EvoNexus-native (not derived from oh-my-claudecode). Header reference added to.claude/rules/dev-phases.mdas the canonical workflow.docs/agents/engineering-layer.md— the "19 Agents" section is now "21 Agents", split into Reasoning (opus/sonnet, 8 agents — Mirror added), Execution (sonnet, 11 agents — Helm added), and Speed (haiku, 2 agents, unchanged). New section "The 6-Phase Workflow" documents the canonical pipeline with phase owners and feature-folder convention.dashboard/frontend/src/pages/Agents.tsx—AGENT_METAnow includeshelm-conductorandmirror-retrowith icons (Navigation,History), colors, labels, and slash commands.ENGINEERING_TIERSupdated: Mirror added toreasoning, Helm added toexecution.NOTICE.md— clarifies that 19 of 21 engineering agents are derived from OMC; Helm and Mirror plusdev-phases.mdare native EvoNexus additions.
- New canonical workflow doc:
.claude/rules/dev-phases.md(auto-loaded by engineering agents as they work). - Updated
docs/llms-full.txt(regenerated viamake docs-build).
- Engineering Layer (19 agents) — complete software development team derived from oh-my-claudecode (MIT, by Yeachan Heo, v4.11.4). The layer is ortogonal to the existing Business Layer (16 agents). EvoNexus now ships with 35 specialized agents in two layers + custom.
- Reasoning tier (opus, 7 agents):
apex-architect,echo-analyst,compass-planner,raven-critic,lens-reviewer,zen-simplifier,vault-security - Execution tier (sonnet, 10 agents):
bolt-executor,hawk-debugger,grid-tester,probe-qa,oath-verifier,trail-tracer,flow-git,scroll-docs,canvas-designer,prism-scientist - Speed tier (haiku, 2 agents):
scout-explorer,quill-writer
- Reasoning tier (opus, 7 agents):
- 25
dev-*skills organized in 3 tiers:- Tier 1 — Core orchestration (15):
dev-autopilot,dev-plan,dev-ralplan,dev-deep-interview,dev-deep-dive,dev-external-context,dev-trace,dev-verify,dev-ultraqa,dev-visual-verdict,dev-ai-slop-cleaner,dev-sciomc,dev-team,dev-ccg,dev-ralph - Tier 2 — Setup & infra (5):
dev-mcp-setup,dev-deepinit,dev-project-session-manager,dev-configure-notifications,dev-release - Tier 3 — Meta utilities (5):
dev-cancel,dev-remember,dev-ask,dev-learner,dev-skillify
- Tier 1 — Core orchestration (15):
- 15 dev templates in
.claude/templates/dev-*.md— one per primary agent output:dev-architecture-decision,dev-work-plan,dev-code-review,dev-bug-report,dev-verification-report,dev-deep-interview-spec,dev-security-audit,dev-test-strategy,dev-trace-report,dev-explore-report,dev-design-spec,dev-analysis-report,dev-research-brief,dev-critique,dev-simplification-report. workspace/development/folder — engineering layer working directory with 7 subfolders (architecture,plans,specs,reviews,debug,verifications,research) and aREADME.md. Distinct fromworkspace/projects/(active git repos).NOTICE.md— third-party attribution foroh-my-claudecodewith full MIT license, version pinned at v4.11.4, modifications listed (renaming, namespacedev-*, memory pattern adaptation, runtime stripping).docs/agents/engineering-layer.md— dedicated documentation page covering tiers, agents, pipelines, working folder, templates, memory pattern, cross-layer handoffs, and attribution.- Two-layer dashboard categorization —
dashboard/frontend/src/pages/Agents.tsxnow categorizes agents into Business / Engineering (with reasoning/execution/speed tiers) / Custom, with auto-derived slash commands and dynamic icon assignment.
- Slash command naming — all 35 core agents now use the full agent name as the slash command (e.g.,
/clawdia-assistant,/flux-finance,/apex-architect,/bolt-executor) instead of short aliases (/clawdia,/flux,/apex,/bolt). The only exception is/oraclewhich is already a single word. The 16 short business commands and the 13 short engineering commands were removed. README.mdupdated — agent count (16 → 35), skill count (~130 → ~137), Engineering Layer mention with attribution, two-layer description.CLAUDE.mdupdated — Active Projects table now lists "Engineering Layer" as delivered (v0.12.0). Folder Structure includesworkspace/development/. "What Claude Should Do" rules cover both layers and link to NOTICE.md.docs/introduction.md— "35 specialized agents in two layers" framing, expanded "Chatbot vs EvoNexus" comparison table including engineering scenarios.docs/architecture.md— diagram refreshed to show 35 agents in two ortogonal layers, ~137 skills, attribution to Yeachan Heo.docs/agents/overview.md— Two-layer intro, 19 engineering agents grouped by tier, all 16 business agents updated with full slash commands.docs/skills/overview.md— engineering layer skills section with all 25dev-*skills grouped by tier; total skill count updated to ~137.docs/agents/{16 individual}.md— slash commands updated to full names (e.g.,/clawdia→/clawdia-assistant).site/src/pages/Home.tsx—35 agents/137+ skillsstats, two-layer feature card, "Meet your new team" section now shows both Business Layer (16 cards) and Engineering Layer (19 cards) with full slash commands and attribution link.site/public/docs/— full mirror sync viamake docs-build.docs/llms-full.txt— regenerated with 62 docs (addedengineering-layer.md)..claude/rules/agents.md— both layers documented (16 + 19) with cross-layer handoff guidance..claude/rules/skills.md—dev-category added with all 25 skills listed; total bumped to ~137.ROADMAP.md— newv0.12 — Engineering Layersection marking the deliverable as[x]with full agent / skill / template enumeration and recommended pipelines.
- Engineering Layer attribution —
NOTICE.mdat repo root +README.mdCredits & Acknowledgments section + per-agent attribution comments + dedicateddocs/agents/engineering-layer.md. - Pattern compliance — all 19 engineering agents follow the EvoNexus standard pattern (rich frontmatter with Examples, Workspace Context, Shared Knowledge Base, Working Folder, Identity, Anti-patterns, Domain, How You Work, Skills You Can Use, Handoffs, Output Format, Continuity). Verified by
@lens-reviewer, 3 fixes applied (oath-verifierdisallowedTools, raven-critic and trail-tracerSkills You Can Usesection).
- Backup excludes reconstructible directories —
backup.pynow excludes top-level dirs that don't contain user data:site/,backups/,.venv/,_evo/,_evo-output/. Also expandedEXCLUDE_DIRSto cover more cache/build folders (.next,.cache,.local,build,.pytest_cache,.ruff_cache,.mypy_cache). Reduces typical backup from ~63k files / 1GB to ~800 files / ~900MB while keeping all user data (workspace, agent-memory, custom skills, dashboard DB). - Custom skill convention unified — product-specific skills (
int-licensing,int-whatsapp,prod-licensing-daily/weekly/monthly, and the 45evo-*skills) renamed tocustom-*prefix so they're automatically gitignored via the existing.claude/skills/custom-*pattern. Thename:frontmatter field in eachSKILL.mdwas updated to match the new folder name (50 skills total). - Agent skill references updated —
atlas-project,dex-data,nova-product,pulse-communitynow reference thecustom-*skill names instead of the old prefixed names. .gitignoresimplified — removed the 5 explicit per-skill entries; the.claude/skills/custom-*pattern covers all custom skills.
- Stale folder references in docs — replaced legacy Obsidian-style paths (
01 Daily Logs/,02 Projects/,05 Financeiro/,09 Estrategia/) with newworkspace/structure (workspace/daily-logs/,workspace/projects/,workspace/finance/,workspace/strategy/) inCLAUDE.md, status command, creating-skills/routines/updating guides, ops-vendor-review skill, andllms-full.txt.
.gitignore— addedconfig/triggers.yamlto gitignored configs.
- SECURITY.md — vulnerability disclosure policy with private reporting channels and contributor security guidelines
- Command injection in dashboard backend — replaced all
subprocess.run(..., shell=True)with argument-list invocations acrosssystems.py,services.py, andtasks.py; added container name validation and path traversal protection - WebSocket authentication bypass — terminal WebSocket handler now verifies
current_user.is_authenticated(previously skippedbefore_requestmiddleware) - Code injection in MemPalace mining — replaced f-string quote interpolation with
repr()to prevent Python code injection via crafted path/wing values - Path traversal in MemPalace sources — source paths now validated against home directory and workspace boundaries
- Rebrand OpenClaude → EvoNexus — full platform rename across ~80 files: docs, dashboard, CLI, site, templates, skills, agents, Docker, env vars (
OPENCLAUDE_PORT→EVONEXUS_PORT), npm package (@evoapi/evo-nexus), GitHub repo (EvolutionAPI/evo-nexus), cover SVG, and all internal references.
- Workspace backup & restore — new
backup.pyscript that exports all gitignored user data (memory, agent-memory, config, dashboard DB, logs, custom agents/commands/templates/routines,.env) as a ZIP with manifest. Supports local storage (backups/) and S3-compatible cloud buckets. Restore with merge (skip existing) or replace (overwrite) mode. - Daily Backup routine — core routine (
ADWs/routines/backup.py) runs at 21:00 daily via scheduler. Pure Python (systematic, no AI, no tokens). Auto-uploads to S3 ifBACKUP_S3_BUCKETis configured. - Backup dashboard page —
/backupspage to list, create, download, restore, and delete backups from the browser. Shows S3 config status, backup metadata from manifest, and restore mode selection modal. - Trigger registry — reactive event triggers (webhook & event-based) that execute skills or routines in response to external events. Supports GitHub, Stripe, Linear, Telegram, Discord, and custom webhooks with HMAC signature validation.
- Triggers dashboard page —
/triggerspage to create, edit, delete, test, enable/disable triggers. Copy webhook URL, regenerate secrets, view execution history. trigger-registryskill — CLI skill to create, manage, and test triggers.- Resume Claude sessions in chat — dashboard chat now lists active/resumable Claude sessions with
--resumesupport. - Makefile targets —
make backup,make backup-s3,make restore,make backup-list,make backup-daily. - S3 backup env vars —
BACKUP_S3_BUCKET,BACKUP_S3_PREFIX,AWS_ENDPOINT_URLin.env.example.
- Core routines — 5 → 6 (Daily Backup added)
- Dashboard screenshots — all page screenshots optimized (50-70% smaller file sizes)
- ROUTINES.md — added Triggers and Daily Backup documentation sections
- docs/ — updated core-routines, makefile reference, env-variables reference, dashboard overview
- Site and docs counts — updated all references from 9/10 agents to 16, from ~68/~80 skills to ~130, across site Home page, introduction, architecture, getting-started, using-agents, initial-setup, dashboard overview, and evolution-foundation case study
- Site Home features — added Channels, Agent Teams, and Scheduled Tasks to the features grid; updated agent showcase to show all 16 agents
- Channels docs in pt-BR — rewrote
docs/guides/channels.mdanddocs/guides/channels-reference.mdto English (docs should always be in English) - README screenshots — restored screenshots section using HTML
<img>tags with consistent sizing (were broken by markdown table layout)
- 6 new core agents — Mako (Marketing), Aria (HR/People), Zara (Customer Success), Lex (Legal/Compliance), Nova (Product), Dex (Data/BI). Each with system prompt, slash command, dashboard card with icon and color, and dedicated skills.
- ~80 new skills — HR (
hr-*), Legal (legal-*), Ops (ops-*), Product Management (pm-*), Customer Success (cs-*), Data/BI (data-*), Marketing (mkt-*). Skill count: ~68 → ~180. - Channels — bidirectional chat bridges that push messages into a running Claude Code session. Discord and iMessage channels added alongside existing Telegram. Each runs as a background screen session.
- Channel documentation —
docs/guides/channels.md(setup guide for all 3 channels) anddocs/guides/channels-reference.md(technical reference for building custom channels/webhooks). - Dashboard channels section — Services page now shows "Channels" as a separate section with Telegram, Discord Channel, and iMessage Channel cards (Start/Stop/Logs).
- Agent documentation — individual doc pages for all 16 agents in
docs/agents/. - Makefile targets —
discord-channel,discord-channel-stop,discord-channel-attach,imessage,imessage-stop,imessage-attach.
- Agent count — 10 → 16 core agents across README, docs, dashboard, and rules
- Skill count — ~68 → ~180 across README, docs, and dashboard
- Dashboard AGENT_META — all 16 agents now have dedicated icons, colors, and command badges
- README — updated architecture diagram, agent list, skill count, dashboard features, and workspace structure
- Custom agents — user-created agents with
custom-prefix. Gitignored, auto-discovered by dashboard (gray "custom" badge vs green "core" badge). Backend returnscustom,color,modelfields from frontmatter. - Oracle agent — 10th core agent.
/oracleworkspace knowledge agent that answers questions about agents, skills, routines, integrations, and configuration by reading the actual documentation. No RAG needed — readsdocs/llms-full.txtand source files directly. create-agentskill — conversational interface to create custom agents (name, domain, personality, model, color, memory folder, slash command)create-commandskill — conversational interface to create standalone slash commands for Claude Code
- Agent count — 9 → 10 core agents (Oracle added) across README, docs, and rules
- Dashboard Agents page — core/custom badges, dynamic colors from frontmatter for custom agents, separate core/custom counters in stats bar
- Documentation — updated agents overview, creating-agents guide (core vs custom section), skills overview
- Scheduled Tasks — new one-off task scheduling system. Schedule a skill, prompt, or script to run at a specific date/time without creating a full routine. Dashboard page at
/taskswith create/edit/cancel/run-now/view-result. API CRUD at/api/tasks. Scheduler checks pending tasks every 30 seconds. schedule-taskskill — conversational interface to create scheduled tasks ("agendar pra sexta 10h", "schedule this for tomorrow")- Dynamic routine discovery —
ROUTINE_SCRIPTSandSCRIPT_AGENTSare no longer hardcoded. Agent and script mappings are built dynamically by scanningADWs/routines/scripts and extracting metadata from docstrings (via AgentNamepattern). New scripts are auto-discovered. make run R=<id>— generic dynamic runner for any routine (core or custom)make list-routines— lists all discovered routines with agent, script, and name- Workspace file browser — reports page replaced with a full file browser that navigates workspace folders
- Makefile cleaned — custom routine targets (user-specific) removed from Makefile. Only core routine targets remain (
morning,eod,memory,memory-lint,weekly). Custom routines run viamake run R=<id>. ROUTINES.md— expanded with scheduled tasks docs, dynamic discovery, and updated manual execution section- Documentation — new
docs/routines/scheduled-tasks.md, updated makefile reference, dashboard overview, creating-routines guide, and skills overview
- Systematic routines — new
run_script()function inADWs/runner.pyfor pure Python routines that run without Claude CLI, without AI, without tokens. Same logging/metrics infrastructure, but cost=$0 and duration in seconds instead of minutes. create-routineskill updated — now asks "AI or systematic?" and generates the correct script pattern. For systematic routines, Claude writes the Python logic once at creation time, then the script runs on its own forever.- Example routine —
ADWs/routines/examples/log_cleanup.pydemonstrates the systematic pattern (deletes logs older than 30 days) - "systematic" badge — dashboard Scheduler and Routines pages show a gray "systematic" badge for system routines instead of green
@agent - Site docs CSS overhaul — replaced fragile custom marked renderers with CSS-based styling on
.docs-content. Tables, lists, code blocks, and all markdown elements now render correctly with the dark theme. - OAuth redirect URLs — documented redirect URIs for YouTube, Instagram, and LinkedIn OAuth setup
- ROADMAP — "Agent-less routines" marked as done
- Core routines documentation (
docs/routines/core-routines.md) — detailed explanation of all 5 core routines: what they do, why they matter, and how they form the daily loop - Memory Lint promoted to core — moved from
ADWs/routines/custom/toADWs/routines/, hardcoded inscheduler.py(Sunday 09:00). Now 5 core routines instead of 4 - Release skill now syncs screenshots (
public/print-*.png→site/public/assets/) on every release
- Dashboard pages redesigned — 12 pages (Audit, Config, Costs, Files, Integrations, Memory, Reports, Roles, Routines, Scheduler, Skills, Systems, Templates, Users) with consistent dark theme and improved UX
- Integration count — 19 → 17 (removed internal-only Licensing and WhatsApp docs from public documentation)
- Memory system — LLM Wiki pattern: ingest propagation, weekly lint, centralized index, and operation log
docs/integrations/licensing.md— internal only, not publicdocs/integrations/whatsapp.md— internal only, not public
- Dashboard build — removed unused
totalTokensvariable in Costs page that blocked TypeScript compilation
- Evolution API skill (
int-evolution-api) — 33 commands: instances, messages (text, media, location, contact, buttons, lists, polls), chats, groups, webhooks - Evolution Go skill (
int-evolution-go) — 24 commands: instances, messages, reactions, presence - Evo CRM skill (
int-evo-crm) — 48 commands: contacts, conversations, messages, inboxes, pipelines, labels - Integration docs — 3 new guides:
docs/integrations/evolution-api.md,evolution-go.md,evo-crm.md - Dashboard integrations — Evolution API, Evolution Go, and Evo CRM cards on Integrations page
.env.example— addedEVOLUTION_API_URL/KEY,EVOLUTION_GO_URL/KEY,EVO_CRM_URL/TOKEN
- Integration count — 16 → 17 across README, site, and docs (removed internal-only Licensing and WhatsApp docs)
- Community members — 7,000+ → 17,000+ on site
- v0.4 roadmap complete — all 13 items done, Evolution product skills was the last one
- Docs markdown rendering — replaced regex parser with
markedlibrary. Code blocks, ASCII art, and nested formatting now render correctly on the site. - README and site —
npx @evoapi/evo-nexusis now the primary install method. Git clone shown as alternative. - Release skill —
make docs-buildand frontend rebuild are now mandatory on every release (not conditional).
- Site /docs navigation — nested doc pages (e.g.,
/docs/guides/creating-routines) no longer 404. Switched fromuseRoutewildcard to direct URL parsing. - Site route matching — changed from
/docs/:slug+to/docs/*for reliable wouter matching. - CLI default directory —
npx @evoapi/evo-nexuswithout args now clones into current directory (.), not a subfolder. - Site CI build — added missing
print-agents.pngto site assets. - Docs sync — site now serves updated docs matching the repo (was stale).
- Active agent visualization — Claude Code hooks (
PreToolUse,Stop) track agent launches inagent-status.json. Dashboard polls/api/agents/activeand shows animated "RUNNING" badges on agent cards and overview. - Agents page redesign — unique icons and accent colors per agent, slash command badges, memory count pills, status dots, hover glow effects.
- Overview page redesign — stat cards with icons and trend indicators, active agents bar, quick actions row (Morning Briefing, Chat, Costs, GitHub), improved reports and routines tables with relative timestamps.
- Claude Code hooks —
agent-tracker.shhook registered insettings.jsonfor real-time agent activity tracking. - Project settings.json — permissions (allow/deny rules), hooks configuration.
- Inner-loop commands —
/status(workspace status) and/review(recent changes + next actions). - Default system: Claude Status —
seed_systems()creates Anthropic status page as default external system on first boot. - Public roadmap —
ROADMAP.mdwith community input via GitHub discussions.
- CLAUDE.md split — reduced from 263 to 128 lines. Detailed config moved to
.claude/rules/(agents, integrations, routines, skills) — auto-loaded by Claude Code. - All 9 agent prompts generalized — removed hardcoded personal references (Omie, Linear, Discord Evolution, Brazilian formats, etc.). User-specific context preserved in
_improvements.mdper agent memory folder. - Rules and commands translated — all
.claude/rules/and.claude/commands/files translated from Portuguese to English.
- Docker Compose for dashboard —
Dockerfile.dashboard(multi-stage: node + python) +docker-compose.ymlwith dashboard, telegram, and runner services.make docker-dashboardto start. - Dashboard CI — GitHub Actions workflow builds and pushes dashboard image to
ghcr.io/evolutionapi/evo-nexus/dashboardon push/release - npm CI — GitHub Actions workflow publishes CLI to npm on release (requires
NPM_TOKENsecret)
- Sidebar reorganized — 5 collapsible groups (Main, Operations, Data, System, Admin) with collapse state persisted in localStorage
- Scheduler removed from docker-compose — runs embedded in dashboard, not as separate service
make docker-up→make docker-telegram— reflects that only Telegram is a separate Docker service- Public roadmap updated — removed internal Future/Research section, marked completed items
- CLI installer —
npx @evoapi/evo-nexusclones repo, checks prerequisites, installs deps, runs setup wizard, and builds dashboard - Version indicator in dashboard — sidebar footer shows current version;
/api/version/checkcompares against latest GitHub release with 1h cache - Public roadmap —
ROADMAP.mdwith 4 phases (v0.4 → Future), community input via GitHub discussions - Update guide —
docs/guides/updating.mdwith git pull, Docker, and custom content preservation instructions
- Privacy-first licensing — removed heartbeat thread, deactivate endpoint, and shutdown hook. Only initial registration remains (who installed). No monitoring, no kill switch, no telemetry.
- Licensing version — now reads from
pyproject.tomldynamically instead of hardcoded constant
- nginx 403 on
/docs/— removed$uri/fromtry_filesso directory paths fall through to SPA instead of returning Forbidden .gitignoreformatting —site/lib/andmempalace.yamlwere concatenated on one line- User-specific files removed from git —
mempalace.yamlandentities.jsonno longer tracked
- Docs page on site (
/docs) — full documentation viewer with sidebar, search, and markdown rendering - Auto-version system —
pyproject.tomlis single source of truth, injected into site (Vite__APP_VERSION__), dashboard (/api/version), and CI (Docker build-arg) - Pre-build docs index —
scripts/build-docs-index.mjsgeneratesdocs-index.jsonat build time /api/versionendpoint — dashboard serves current version frompyproject.toml
make docs-build— now also syncsdocs/tosite/public/docs/- Docs links in landing page point to
/docs(internal route, not dashboard) - Site version badge — reads from
pyproject.tomldynamically instead of hardcoded
- Landing page (
site/) — standalone React + Vite static site, extracted from Replit monorepo - Docker support for site — multi-stage Dockerfile (node build → nginx serve) + docker-compose
- GitHub Actions CI — workflow builds site image and pushes to
ghcr.io/evolutionapi/evo-nexus/siteon push/release - Docs bundled in site image —
docs/copied into site build context automatically
.gitignoreupdated — site tracked in repo (Replit artifacts, node_modules, dist excluded)- Site assets renamed — clean filenames (
logo.png,print-overview.png, etc.) instead of Replit hashes
- Public Documentation (
/docs) — full docs site inside the dashboard, accessible without auth - MemPalace — semantic knowledge base with ChromaDB for code/doc search (optional)
- Content search — docs search now matches inside file content, not just titles
- llms-full.txt — pre-generated plain text with all docs for LLM consumption (
/docs/llms-full.txt) - 23 routine examples and 21 template examples shipped with repo
- 14 documentation screenshots in
docs/imgs/ - Comprehensive docs — 28 markdown files across 9 sections (guides, dashboard, agents, skills, routines, integrations, real-world, reference)
- Practical usage guides — how to run routines, invoke agents, create custom skills
- Unofficial disclaimer — README, docs, and landing page clearly state "unofficial, not affiliated with Anthropic"
- Positioning — "compatible with Claude Code and other LLM tooling" (not "purpose-built for")
- Enterprise-safe language — "integrates with" instead of "leverages", opens door for multi-provider future
- Docs sidebar — logical section ordering, section icons, content preview in search
- llms-full.txt — served as static pre-generated file (instant load, no on-the-fly concatenation)
- i18n — final cleanup, 18 files translated from Portuguese to English
/docs/llms-full.txtredirect (was showing docs sidebar with "Loading..." instead of plain text)- Screenshots with personal data removed and replaced
- 10 doc files corrected after full audit
- Core vs Custom split — routines, templates, and skills separated into core (tracked) and custom (gitignored)
- Create Routine skill (
create-routine) — guides users through creating custom routines step by step - Scheduler embedded in dashboard — runs automatically with
make dashboard-app, no separate process - Core/Custom badges — scheduled routines and templates show green "core" or gray "custom" labels
- Custom routines from YAML — scheduler loads custom routines dynamically from
config/routines.yaml - .env editor — edit environment variables directly from the Config page in the dashboard
- Auto-discover reports — Reports page scans entire
workspace/recursively, no hardcoded paths
- Routines reorganized — 4 core routines in
ADWs/routines/, custom inADWs/routines/custom/(gitignored) - Templates reorganized — 2 core HTML + 4 core MD templates, custom in
custom/subfolders (gitignored) ADWs/rotinas/renamed toADWs/routines/— full English naming- Agent files renamed —
flux-financeiro→flux-finance,nex-comercial→nex-sales - 59 evo- skills removed* — Evo Method is a separate project, skills gitignored
- Docker removed from Services — use Systems CRUD for Docker container management
- ROUTINES.md rewritten — generic, documents core vs custom split and YAML config format
- scheduler.py rewritten — only 4 core routines hardcoded, custom loaded from YAML
- README updated — correct agent names (
/clawdia,/flux,/atlas, etc.), 4 core routines, ~67 skills
- ROADMAP.md from Config page (file no longer exists)
- Docker section from Services page
- Specific routine schedules from scheduler.py (moved to user's
config/routines.yaml) - Custom routines from git — 23 scripts moved to gitignored
custom/directory - Custom templates from git — 15 HTML + 6 MD templates moved to gitignored
custom/directories
- Custom routine scripts
sys.pathadjusted forcustom/subdirectory (3 levels up for runner) - Scheduler parser strips
custom/prefix for agent mapping SCRIPT_AGENTSmoved to module level (was inaccessible from_load_yaml_routines)- Telegram
screencommand removed unsupported-Logfileflag - Remaining Portuguese translated in skill bodies
- Silent Licensing — automatic registration via Evolution Foundation licensing server
- Systems CRUD — register and manage apps/services from the dashboard
- Roles & Permissions — custom roles with granular permission matrix
- Onboarding Skill (
initial-setup) — guides new users through the workspace - Screenshots in README (overview, chat, integrations, costs)
- English-first codebase — translated agents, skills, templates, routines, and config
- Workspace folders renamed from PT to EN (
workspace/daily-logs, etc.) - Setup wizard simplified — all agents enabled by default
- HTML templates standardized with Evolution Foundation branding
- Makefile auto-detects
uvor falls back topython3 - All Python dependencies consolidated in
pyproject.toml
- Evo Method (
_evo/) — separate project - Proprietary skills — licensing and whatsapp excluded
- Portuguese folder names (01-09) — replaced with
workspace/
- 16 bug fixes (scheduler logs, SQLite WAL, auth permissions, dates, etc.)
- Initial open source release
- 9 Specialized Agents, ~67 Skills, 4 core routines
- Web Dashboard with auth, roles, web terminal, service management
- Integration clients (Stripe, Omie, YouTube, Instagram, LinkedIn, Discord)
- ADW Runner with token/cost tracking
- Persistent memory system
- Setup wizard (CLI + web)