{"id":51609585,"url":"https://github.com/vdustr/slack-status-codexbar","last_synced_at":"2026-07-12T06:02:27.049Z","repository":{"id":358242341,"uuid":"1240618120","full_name":"VdustR/slack-status-codexbar","owner":"VdustR","description":"Sync CodexBar multi-provider usage into Slack custom status.","archived":false,"fork":false,"pushed_at":"2026-05-16T12:42:40.000Z","size":98,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-16T13:28:53.334Z","etag":null,"topics":["ai-agents","claude","codex","codex-skill","codexbar","gemini","launchd","macos","slack","slack-status"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/VdustR.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-16T11:01:14.000Z","updated_at":"2026-05-16T12:42:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/VdustR/slack-status-codexbar","commit_stats":null,"previous_names":["vdustr/slack-status-codexbar"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/VdustR/slack-status-codexbar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VdustR%2Fslack-status-codexbar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VdustR%2Fslack-status-codexbar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VdustR%2Fslack-status-codexbar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VdustR%2Fslack-status-codexbar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VdustR","download_url":"https://codeload.github.com/VdustR/slack-status-codexbar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VdustR%2Fslack-status-codexbar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35383520,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-12T02:00:06.386Z","response_time":87,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","claude","codex","codex-skill","codexbar","gemini","launchd","macos","slack","slack-status"],"created_at":"2026-07-12T06:02:22.661Z","updated_at":"2026-07-12T06:02:27.021Z","avatar_url":"https://github.com/VdustR.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# slack-status-codexbar\n\nUnofficial Slack status integration powered by CodexBar.\n\nSlackStatusCodexBar runs the CodexBar CLI and syncs a compact multi-provider summary into your Slack custom status.\n\nSlack renders the emoji separately from the status text. With the built-in formatter, a healthy status appears like this in Slack:\n\n```text\n🔋 Codex 53%@18:34/46%@5/19 08:10 · Claude 65%@5/16 20:00/90%@5/23 05:00\n```\n\n## Design\n\n- Agent-neutral: not tied to Claude Code, Codex, or any single provider.\n- CodexBar-owned provider configuration: enabled providers, source mode, token accounts, cookies, OAuth, API keys, and provider order are inherited from CodexBar CLI defaults, with optional provider-specific CLI source overrides.\n- LaunchAgent-based ambient refresh: macOS `launchd` runs refresh on an interval so the status remains active after setup.\n- Slack-only ownership: this project handles Slack profile writes, throttling, ownership checks, logs, and formatting.\n- No auto-expiration by default: Slack `status_expiration` is `0`.\n\nBy default refresh runs:\n\n```bash\ncodexbar usage --format json --json-only\n```\n\nThe primary command intentionally does not pass `--provider` or `--source`, so CodexBar decides the enabled providers and source mode. The default config also runs a provider-specific CLI override for Claude:\n\n```bash\ncodexbar usage --provider claude --source oauth --format json --json-only\n```\n\nThe Claude override matches CodexBar app behavior for accounts where the CLI's default Claude web source can report stale zero usage. This integration still stays CLI-only and does not read CodexBar's widget snapshot cache or app group container.\n\nWhen the Gemini provider uses CLI OAuth under `launchd`, set `codexbar.geminiCliPath` to the real Gemini CLI binary path discovered during setup. SlackStatusCodexBar passes it to CodexBar as `GEMINI_CLI_PATH`, so CodexBar can refresh expired Gemini OAuth credentials without relying on an interactive shell PATH.\n\n## Slack Status Examples\n\nThe built-in formatter writes Slack profile fields like:\n\n```json\n{\n  \"status_emoji\": \":battery:\",\n  \"status_text\": \"Codex 53%@18:34/46%@5/19 08:10 · Claude 65%@5/16 20:00/90%@5/23 05:00\",\n  \"status_expiration\": 0\n}\n```\n\nSlack then displays the emoji and text together:\n\n| Slack display | `status_emoji` | Example `status_text` | Meaning |\n| --- | --- | --- | --- |\n| 🔋 Codex 53%@18:34/46%@5/19 08:10 · Claude 65%@5/16 20:00/90%@5/23 05:00 | `:battery:` | `Codex 53%@18:34/46%@5/19 08:10 · Claude 65%@5/16 20:00/90%@5/23 05:00` | Healthy quota across displayed providers. |\n| 🪫 Codex 27%@18:34/42%@5/19 08:11 | `:low_battery:` | `Codex 27%@18:34/42%@5/19 08:11` | A displayed window is low, but not critical. |\n| ⚠️ Codex 15%@18:34/90%@5/19 08:10 | `:warning:` | `Codex 15%@18:34/90%@5/19 08:10` | A displayed short window is at the warning threshold. |\n| ⛔ Codex 0%@18:34/42%@5/19 08:11 | `:no_entry:` | `Codex 0%@18:34/42%@5/19 08:11` | A displayed quota window is exhausted. |\n\n`@18:34` and `@5/19 08:10` are compact reset labels. Approximate labels such as `@~5h` are used when CodexBar only reports the window duration.\n\n## Runtime Paths\n\n```text\n~/Library/Application Support/SlackStatusCodexBar/\n~/Library/Logs/SlackStatusCodexBar/\n~/Library/LaunchAgents/dev.vdustr.slack-status-codexbar.plist\n```\n\n## Prerequisites\n\n- Node 22+\n- `pnpm`\n- CodexBar app configured with the desired providers\n- CodexBar CLI installed as `codexbar`\n- Real Gemini CLI binary path, when Gemini is enabled and installed through a shim manager such as mise\n- Slack user token with `users.profile:read` and `users.profile:write`\n  - `SLACK_STATUS_USER_TOKEN`, or\n  - `SLACK_MCP_XOXP_TOKEN`\n\n## Development\n\n```bash\ncd skills/slack-status-codexbar\npnpm install\npnpm test\npnpm typecheck\npnpm build\n```\n\nUseful local checks:\n\n```bash\nnode dist/hook.mjs refresh --dry-run\nnode dist/hook.mjs launchd-plist\n```\n\nLaunchAgent wrappers should use absolute tool paths discovered during setup because launchd does not inherit the interactive shell PATH. If the Slack token is loaded from `~/.env.local`, wrap the command with `vp-env-secrets/scripts/envctl run` and set a fixed PATH that includes `dotenvx`.\n\nSecrets must stay separate from normal runtime config. Do not store Slack tokens in `config.json`, plist files, state files, logs, or docs. Use an existing user env source, a dedicated secret env file, or a runtime secret command after confirming the user's preference.\n\n## Notes\n\nSlackStatusCodexBar does not migrate or remove older Claude-specific hook installations. If another tool is also writing your Slack status, disable it manually before enabling this integration.\n\nThe built-in formatter hides providers that only return errors. Reset times are shown for each displayed rate-limit window when the CodexBar CLI provides `resetDescription` or `resetsAt`; if CodexBar only provides `windowMinutes`, the formatter shows an approximate label such as `@~5h`.\n\nIf CodexBar returns no usable provider windows or credit data, SlackStatusCodexBar skips the Slack profile update instead of writing an unavailable status. For `refresh --dry-run`, this returns `ok: false` with `profile: null`.\n\nDefault emoji continue the original Claude Slack status style: 🔋 `:battery:`, 🪫 `:low_battery:`, ⚠️ `:warning:`, and ⛔ `:no_entry:`. Short windows use the original `40/20` low/warning thresholds, seven-day windows use `29/14`, and the chosen emoji comes from the most severe displayed quota window.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvdustr%2Fslack-status-codexbar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvdustr%2Fslack-status-codexbar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvdustr%2Fslack-status-codexbar/lists"}