{"id":47809538,"url":"https://github.com/ericclemmons/better-plexer","last_synced_at":"2026-04-03T18:04:17.320Z","repository":{"id":336175349,"uuid":"1148474509","full_name":"ericclemmons/better-plexer","owner":"ericclemmons","description":null,"archived":false,"fork":false,"pushed_at":"2026-02-03T05:17:42.000Z","size":22,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-03T18:41:57.638Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ericclemmons.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-02-03T02:18:54.000Z","updated_at":"2026-02-03T18:01:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ericclemmons/better-plexer","commit_stats":null,"previous_names":["ericclemmons/better-plexer"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ericclemmons/better-plexer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericclemmons%2Fbetter-plexer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericclemmons%2Fbetter-plexer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericclemmons%2Fbetter-plexer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericclemmons%2Fbetter-plexer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ericclemmons","download_url":"https://codeload.github.com/ericclemmons/better-plexer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ericclemmons%2Fbetter-plexer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31368157,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-03T17:53:18.093Z","status":"ssl_error","status_checked_at":"2026-04-03T17:53:17.617Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-04-03T18:04:17.176Z","updated_at":"2026-04-03T18:04:17.297Z","avatar_url":"https://github.com/ericclemmons.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Better Plexer\n\nA cloud-native chat multiplexer for AI coding sessions. Think of it as a workspace manager for CLI-based AI tools like Claude Code, OpenCode, or Codex — deployed on Cloudflare's edge infrastructure.\n\n## Key Features\n\n- **Multi-repo Sessions**: A single chat session can coordinate changes across multiple repositories and branches\n- **Cloud-native**: Accessible from anywhere, deployed on Cloudflare Workers\n- **Thin-client Design**: No GUI for chats — delegates to CLI tools. The UI is purely for workspace visibility\n- **Sandbox Execution**: Uses Cloudflare Sandboxes for isolated execution and CI-like validation\n- **Real-time Updates**: WebSocket-based terminal streaming and status updates\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                    Cloudflare Access (Auth)                      │\n└─────────────────────────────────────────────────────────────────┘\n                                │\n                                ▼\n┌─────────────────────────────────────────────────────────────────┐\n│                     Cloudflare Worker                            │\n│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────────┐  │\n│  │   Hono API  │  │  Static UI  │  │  Session Coordinator DO │  │\n│  └─────────────┘  └─────────────┘  └─────────────────────────┘  │\n└─────────────────────────────────────────────────────────────────┘\n          │                                    │\n          ▼                                    ▼\n┌─────────────────┐              ┌─────────────────────────────────┐\n│   KV (Sessions) │              │        Cloudflare Sandboxes     │\n└─────────────────┘              │  ┌─────────┐    ┌─────────────┐ │\n          │                      │  │ Primary │    │ Validation  │ │\n          │                      │  │ Sandbox │    │ Sandboxes   │ │\n          ▼                      │  └─────────┘    └─────────────┘ │\n┌─────────────────┐              └─────────────────────────────────┘\n│  R2 (Storage)   │                             │\n│  - Repos        │                             │\n│  - Shared cfg   │◄────────────────────────────┘\n└─────────────────┘\n```\n\n## Workflow\n\n1. **Create Session**: Name it, optionally link to a task (JIRA-123), pick your AI agent\n2. **Add Repositories**: Mount 0-N repos with branch information\n3. **Start Session**: Primary sandbox spins up with your chosen AI agent\n4. **Work**: Agent makes changes across repos, creating branches as needed\n5. **Validate**: Spawn validation sandboxes to run tests (like CI)\n6. **Complete**: Push branches, create PRs\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Start dev server (runs Wrangler on port 8788)\nnpm run dev\n\n# In a separate terminal, start the PTY server for local terminal support\nnode pty-server.mjs\n\n# Type check\nnpm run typecheck\n\n# Deploy to Cloudflare\nnpm run deploy\n```\n\n### Local Development Notes\n\n- The dev server runs at `http://localhost:8788`\n- The PTY server runs on port 7681 and provides terminal I/O for sessions\n- Sandboxes in production use Cloudflare's container infrastructure; locally you'll need the PTY server running\n- Drag-and-drop images onto the terminal to attach them (saved to `/tmp/plexer-images/`)\n\n## Project Structure\n\n```\n├── src/\n│   ├── index.ts              # Main worker entry point\n│   ├── types.ts              # TypeScript types\n│   ├── ui/\n│   │   └── templates.ts      # HTML templates for UI\n│   └── durable-objects/\n│       └── session-coordinator.ts  # Real-time coordination\n├── public/\n│   └── styles.css            # UI styles\n├── wrangler.jsonc            # Cloudflare configuration\n└── package.json\n```\n\n## Configuration\n\nBefore deploying, you'll need to:\n\n1. Create a KV namespace: `wrangler kv:namespace create SESSIONS`\n2. Create an R2 bucket: `wrangler r2 bucket create plexer-storage`\n3. Update `wrangler.toml` with the actual IDs\n4. Set up Cloudflare Access for your domain\n\n## Status\n\n🚧 **Work in Progress**\n\n- [x] Core data models\n- [x] API routes for session CRUD\n- [x] Gorgeous dark UI\n- [x] Durable Object for coordination\n- [x] Cloudflare Sandbox integration\n- [x] Terminal component (ghostty-web)\n- [x] Image drag-and-drop support\n- [ ] SKILLS.md for agent instructions\n- [ ] R2 bucket mounting\n- [ ] Multi-repo coordination logic\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericclemmons%2Fbetter-plexer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fericclemmons%2Fbetter-plexer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fericclemmons%2Fbetter-plexer/lists"}