
Foxl v0.2.27 cleans up three areas that had grown unwieldy: the sidebar, the skill library, and the system tray. Each of them was adding options instead of removing them, and the app had quietly gotten heavier than it should be. This release trims and regroups without losing functionality.
Integrations, Skills, and Tools are not the same thing
Before v0.2.27, the Integrations page listed every skill in the library that declared any requires metadata. That's how local document processors (pdf / pptx / xlsx / docx), coding helpers (codex-cli / claude-code / gemini / coding-agent / electron / skill-creator), and developer ergonomics (browser-tool / exec-tool / git-tool / code-search-tool / web-fetch-tool / research-assistant / tmux / video-frames / sherpa-onnx-tts / healthcheck) all ended up on what users read as a "connect Foxl to third-party services" page. None of those reach outside the machine. They didn't belong there.
The Integrations page is now third-party only. It uses an explicit allowlist in SKILL_CATEGORY — OAuth providers (Microsoft 365, Slack) plus SaaS-shaped skills (notion, obsidian, github, gws, weather, outlook, outlook-web, quip, himalaya, spotify, spotify-player, sonos, voice-call). Categories are reduced to Featured / Productivity / Communication / Media & Audio / Automation. The "Dev Tools" and "Other" sections are gone.
The Skills page is still the full catalog — document processors, coding helpers, and every local skill remain visible and toggleable there. Enable state is the same bit across both surfaces: POST /api/skills/:id/enable and /disable. Toggling from Integrations shows up on Skills and vice versa. Skills surfaces the raw SKILL.md contents and the richer per-skill configuration; Integrations is the simpler, opinionated face of the same state.
The sidebar is now Agents → Integrations → Skills → Tools → Schedules, reading outward from "connect me to a service" (Integrations) to "what the agent can do" (Skills / Tools) to "when it runs" (Schedules). Agents stays at the top of the Extend group because Agents is the thing being extended.
The library is ~60% smaller
We deleted 32 rarely-used skills from the local dir: 1password, apple-notes / notes-native / photos / reminders, bear-notes, bird, blogwatcher, blucli, camsnap, code-review, drawio, eightctl, food-order, gifgrep, goplaces, imsg, kakaotalk, kiro-send-tool, local-places, mole, oracle, peekaboo, sag, songsee, things-mac, wacli, openhue, whisper, whisper-api. The discord and slack skill folders are also gone — those duplicated the native Channel adapters and the overlap was confusing: enabling "slack" as a skill didn't actually enable the Slack channel.
The ~21 document and productivity skills that survive ship enabled: true by default (browser-tool, code-search-tool, exec-tool, git-tool, gws, github, morning-briefing, notion, obsidian, research-assistant, session-logs, skill-creator, web-fetch-tool, weather, outlook, outlook-web, pdf, pptx, xlsx, docx, quip). The rest default to enabled: false so they stop bloating the prompt token count until a user flips them on. On a fresh install, 19 of 35 skills are on. Previously it was ~70 of 70.
Git is not a built-in tool anymore
The dedicated git tool provided a subcommand API for status / diff / log / branch / checkout / commit / push / pull / add / stash. Useful surface, but completely redundant with exec. The agent already shells out to git status / git diff / etc. via exec, and that composes better — pipes work, custom flags work, git log --graph --decorate works. The subcommand API just duplicated behavior and drifted over time.
Dropped from tool-profiles.ts (standard and full profiles), registry.ts, and SKILL_PROVIDED_TOOLS. The agent still knows about git through skill instructions and through exec's approval path for destructive operations (push, commit). Token cost of the full profile drops slightly; behavior is the same.
Integrations page: unified install modal, hero carousel that actually rotates
Three smaller fixes that were overdue:
- Hero carousel rotates through skills, not just OAuth. The Integrations page used to gate the rotating hero on
hero.kind === 'oauth', so once the carousel rolled past Microsoft 365 and Slack it hid itself entirely. Every featured item now carries a gradient and samplePrompt, with skill-specific hero decoration for github / notion / obsidian / gws / spotify / sonos / weather / outlook / quip / trello. - M365 and Slack open the same install modal as skill credentials. Clicking Connect on an OAuth row used to jump straight to the browser. Now it opens
OAuthConnectDialog (the Codex-style install modal) with provider icon, permission bullets (Mail.ReadWrite, chat:write, etc.), and a workspace subdomain input for Slack. Disconnect still one-clicks from the row. - Skill install modal always shows a primary button. Previously the modal only rendered its
Connect <Service> button when the skill had env vars and the user had typed something. Skills with no env vars had no CTA at all. The modal now always renders the button with three label states: "Enable <X>" (no env vars, one click to acknowledge), "Connect <X>" (user filled in something), or "<X> is connected" (credentials already stored). - Channel icons show up again.
bridgeManager.listAvailableChannels() and getChannelsByCategory() never populated an icon field, so every channel row was rendering <img src="undefined"> and falling back to two-letter initials. Both methods now emit icon: "/channel-icons/<type>.svg", which matches the static assets in apps/web/public/channel-icons/ (Telegram, Discord, Slack, Matrix, Signal, WhatsApp, Teams, etc.).
Tray menu, trimmed to essentials
The macOS menu bar dropdown had accumulated seven items over the years (Stop Agent, Dark Mode, Always on Top, Open Workspace, Reload, plus the usual New Chat / Open / Quit). None of them had telemetry suggesting anyone used them — and all of them are available from inside the app.
The new menu is Codex-style: a "Recent" header with the three most recent chats (each jumps straight to the thread via the navigate IPC with the conversation id), a "Usage" block pulled from /api/usage?range=7d showing total tokens and spent USD over the last 7 days, then New Chat / Open Foxl / Quit Foxl. Menu rebuilds lazily on mouse-enter / right-click so recents and usage stay fresh without polling. Applied in both main.js (dev) and main-production.js.
Credits in the sidebar avatar popover
A smaller quality-of-life change: clicking the user avatar in the sidebar footer now shows a compact credit breakdown. Tier badge (Pro / Ultra) next to the name, a progress bar with NN% used, and an Upgrade link for free-tier users that jumps to the Account page. The bar turns amber above 80% used and red above 95%.
The first cut of this shipped with remaining / total text (e.g. "1032 / 5100") next to a bar that filled left-to-right as usage increased — the text and the bar direction were in direct conflict. The fix is small: swap to NN% used so the bar and the label agree. The full used / remaining / monthly total breakdown stays on the Account page where there's room for three stats side by side.
Skill API keys are managed from the UI
Skills that declare requires.env in their SKILL.md used to rely on the user setting environment variables in their shell profile. That worked for technical users and was invisible to everyone else. In v0.2.27 there's a new JSON-backed secret store (server/integrations/skill-secrets.ts). Values typed into the Integrations page are persisted and flow into every exec / process invocation via buildSkillEnv(process.env), with the shell environment still taking precedence so existing setups aren't broken.
Three new endpoints back the UI: GET /api/integrations/skills lists every skill that has requires metadata (normalized — supports both array form [BINNAME] and object form {env, bins}), PUT /api/integrations/skill-env/:name stores a value, and DELETE /api/integrations/skill-env/:name removes it. integration:* entries (the OAuth-gated kind) are still handled separately and don't surface as env vars.
What's next
The model default is now Opus 4.7 across the app, docs, and sample screenshots. The on-brand "What can I help you with today?" greeting is the only thing on the empty chat screen — no more suggestion cards, no "Good evening." — matching the minimal look we wanted from the start. Docs (skills, tools, memory) have been rewritten to match the trimmed library.
Expect the next few releases to focus on the agent itself: better subagent result synthesis, improved multi-turn planning, and more conservative default tool access for fresh installs. The sidebar reorg you see in v0.2.27 is a foundation — the next thing you'll notice is the agent getting quieter and more accurate, not the UI getting busier.