Local Slack Web to Codex bridge for Bob.
Project description
personal-slack-agent
Setup | How It Works | Commands | Configuration | Publishing | Latest GitHub Release
personal-slack-agent is a local Slack-to-Codex bridge. It runs a background
agent named Bob on your machine, watches approved Slack conversations, starts
or resumes local Codex sessions, and posts status plus results back into Slack
threads.
Why Bob Exists
Some company environments restrict direct integrations between AI coding tools and internal messaging systems. A team may not be able to install a Slack app, grant OAuth scopes to a hosted connector, expose internal messages to a third party service, or run a cloud bot that talks to Codex on the user's behalf.
Bob is built for that constraint. Instead of acting as a hosted Slack app, Bob runs locally beside Codex and uses a browser-authenticated Slack Web session that the user already controls. Work still happens on the user's machine, while Slack becomes the coordination surface: prompts, progress, waiting states, approvals, and final answers remain visible in the approved company messaging system.
The goal is not to replace Codex. The goal is to make Codex work trackable from Slack when Slack is where the team already coordinates.
What Bob Does
- Watches configured Slack channels or explicitly allowed runtime conversations.
- Accepts messages that invoke a configured Slack callsign such as
Boborbob. - Starts a new local Codex session for a new Slack thread.
- Resumes the same local Codex session when someone replies in that thread.
- Posts working, waiting, approval, error, and final messages back to Slack.
- Lets terminal-originated requests use the same Slack-thread-backed workflow.
- Keeps per-channel memory policy explicit so shared channels do not update personal durable notes by accident.
How It Works
At a high level:
- Bob attaches to a local Chrome session that is already logged into Slack.
- Bob watches Slack Web realtime events and targeted Slack Web API responses.
- When an allowed user invokes Bob, Bob creates or resumes local Codex work.
- Bob posts lifecycle updates and final output back into the Slack thread.
The Slack thread is the human-readable work log. The local state database maps Slack threads to Codex session ids so later Slack replies can continue the same conversation.
For a deeper architecture walkthrough, see docs/how-it-works.md.
Current Status
The project is functional but still experimental.
Working pieces include:
- package install and CLI entry points
- config generation and validation
- background watcher loop
- websocket-first Slack event detection
- targeted Slack API hydration for channel roots and thread replies
- thread/session mapping to local Codex sessions
- thread reply resume for existing sessions
- waiting-state reminders and auto-close handling
- manual
<callsign> closethread closure with later resume support - cleanup of obsolete waiting prompts after resolution
- local process control with
bobctl start|stop|restart|status|tail-log|show-config|doctor - GitHub Actions CI, generated GitHub Releases, manual TestPyPI publishing, and PyPI publishing from generated release artifacts
Current constraints:
- macOS only
- Chrome or Chromium required
- Slack integration uses Slack Web realtime sockets plus browser-session-backed Slack Web requests, not an official Slack app install
- broad Slack message edit/delete flows are still limited beyond targeted waiting-prompt cleanup
- browser/web request behavior may need adjustment if Slack changes private web client APIs or websocket behavior
Quick Start
Install Bob from PyPI:
python3 -m venv .venv
.venv/bin/python -m pip install -U pip
.venv/bin/python -m pip install personal-slack-agent
Generate local config:
.venv/bin/bob-init
Start Bob:
.venv/bin/bobctl start --config ~/.config/personal-slack-agent/bob.toml --poll-interval-seconds 10
Trigger Bob from Slack with a configured callsign:
Bob, summarize this repo
Changing defaults.assistant_names only changes Slack-facing callsigns and
reply labels. The local command names remain fixed: bob, bobctl,
bob-agent, and bob-init.
For Chrome setup, Slack auth discovery, config review, and smoke testing, use docs/setup.md.
Docs
- Setup guide: install, Chrome setup, first config, smoke test.
- How it works: motivation, architecture, and message flow.
- Config guide: field-by-field
bob.tomlreference. - Command reference:
bob,bob-agent,bob-init, andbobctl. - Development guide: editable install and test commands for repo work.
- Publishing guide: GitHub Releases, TestPyPI, PyPI options, and package exposure.
- Slack client findings: implementation notes from Slack Web inspection.
- Sample config: committed anonymized config template.
Security Notes
slack_api_tokenis sensitive and should not be committed.- Do not publish personal
bob.tomlfiles. - Do not share the Chrome profile used for Slack browser auth.
- Treat GitHub Releases, TestPyPI, and PyPI as public distribution channels.
- Published Python wheels contain readable
.pysource files.
Project Layout
src/personal_slack_agent/: package sourcetests/: automated testsconfig/bob.sample.toml: anonymized sample configdocs/: setup, operation, architecture, and publishing docs.github/workflows/: CI, release, TestPyPI, and PyPI workflowspyproject.toml: package metadata
Development Setup And Testing
Use an editable install when working from a repo checkout:
python3 -m venv .venv
.venv/bin/python -m pip install -U pip
.venv/bin/python -m pip install -e '.[dev]'
Run the full test suite:
.venv/bin/python -m pytest -q
For more repo-development notes, see docs/development.md.
License
This project is licensed under the MIT License. See LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file personal_slack_agent-0.1.16.tar.gz.
File metadata
- Download URL: personal_slack_agent-0.1.16.tar.gz
- Upload date:
- Size: 122.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b95b409f5935fa7af4881586389332a8c84ea81cf473aafb55078b6a45d4d38
|
|
| MD5 |
c1939303415f47c6884973c4b65dd406
|
|
| BLAKE2b-256 |
aacb41078013d357ef20e2f50291b16d410fe6317b4fbadcc6e3892fe1e6b523
|
Provenance
The following attestation bundles were made for personal_slack_agent-0.1.16.tar.gz:
Publisher:
pypi.yml on ethanyc216/personal-slack-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
personal_slack_agent-0.1.16.tar.gz -
Subject digest:
4b95b409f5935fa7af4881586389332a8c84ea81cf473aafb55078b6a45d4d38 - Sigstore transparency entry: 1437008195
- Sigstore integration time:
-
Permalink:
ethanyc216/personal-slack-agent@a2d8f2da9bacbb34d5f98e4f4966987ef10336bf -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ethanyc216
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@a2d8f2da9bacbb34d5f98e4f4966987ef10336bf -
Trigger Event:
workflow_run
-
Statement type:
File details
Details for the file personal_slack_agent-0.1.16-py3-none-any.whl.
File metadata
- Download URL: personal_slack_agent-0.1.16-py3-none-any.whl
- Upload date:
- Size: 79.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
144c1f30041b27a43521acf1e28f469a2bf4917db08ccd1205d1a30612c7955f
|
|
| MD5 |
895653dfcf50fc7f0c28794e69328859
|
|
| BLAKE2b-256 |
569645ee375cff945f76e499ea9f5b085cd46dd241486552a294ba501e25d0f8
|
Provenance
The following attestation bundles were made for personal_slack_agent-0.1.16-py3-none-any.whl:
Publisher:
pypi.yml on ethanyc216/personal-slack-agent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
personal_slack_agent-0.1.16-py3-none-any.whl -
Subject digest:
144c1f30041b27a43521acf1e28f469a2bf4917db08ccd1205d1a30612c7955f - Sigstore transparency entry: 1437008204
- Sigstore integration time:
-
Permalink:
ethanyc216/personal-slack-agent@a2d8f2da9bacbb34d5f98e4f4966987ef10336bf -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ethanyc216
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@a2d8f2da9bacbb34d5f98e4f4966987ef10336bf -
Trigger Event:
workflow_run
-
Statement type: