{"id":44254051,"url":"https://github.com/laplace-live/jupiter","last_synced_at":"2026-02-10T16:01:35.859Z","repository":{"id":310393509,"uuid":"1029143443","full_name":"laplace-live/jupiter","owner":"laplace-live","description":"High performance bilibili live events forwarder/monitor for social chats","archived":false,"fork":false,"pushed_at":"2026-02-09T16:16:26.000Z","size":98,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-02-09T20:20:23.579Z","etag":null,"topics":["bilibili","bilibili-live","discord","laplace-chat-integrations","laplace-live","telegram"],"latest_commit_sha":null,"homepage":"https://subspace.institute/docs/laplace-chat/jupiter","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/laplace-live.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":"2025-07-30T15:31:07.000Z","updated_at":"2026-02-09T16:16:29.000Z","dependencies_parsed_at":"2025-08-17T21:18:35.609Z","dependency_job_id":"6357a3cd-5cce-46eb-bebb-35317591580b","html_url":"https://github.com/laplace-live/jupiter","commit_stats":null,"previous_names":["laplace-live/jupiter"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/laplace-live/jupiter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laplace-live%2Fjupiter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laplace-live%2Fjupiter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laplace-live%2Fjupiter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laplace-live%2Fjupiter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/laplace-live","download_url":"https://codeload.github.com/laplace-live/jupiter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laplace-live%2Fjupiter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29306426,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T15:37:45.286Z","status":"ssl_error","status_checked_at":"2026-02-10T15:37:41.567Z","response_time":65,"last_error":"SSL_read: 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":["bilibili","bilibili-live","discord","laplace-chat-integrations","laplace-live","telegram"],"created_at":"2026-02-10T16:01:35.070Z","updated_at":"2026-02-10T16:01:35.848Z","avatar_url":"https://github.com/laplace-live.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LAPLACE Jupiter\n\nHigh performance bilibili live events forwarder/monitor for social chats\n\nA bot that connects to multiple LAPLACE Event Bridge WebSocket servers simultaneously and aggregates live stream chat events to forward to social chats based on room configuration.\n\nThis is the successor of [eop-blive](https://subspace.institute/docs/eye-of-providence/eop_blive) project.\n\n## Features\n\n- 🔌 Connects to multiple LAPLACE Event Bridges simultaneously\n- 📡 Aggregates events from all connected bridges\n- 🎯 Room-based event filtering and routing\n- 💬 Different channels for different event types (gifts vs other events)\n- 🔄 Automatic reconnection support for each bridge\n- 📋 YAML-based configuration\n- 🔀 Fault tolerance - continues running even if some bridges fail\n\n## How It Works\n\nThe bot will:\n\n1. Load configuration from `config.yaml`\n2. Connect to all configured LAPLACE Event Bridges\n3. Aggregate events from all bridges\n4. Filter incoming events by room ID\n5. Route events to appropriate social chats\n\n## Multiple Event Bridges\n\nThe bot supports connecting to multiple event bridges simultaneously. This is useful for:\n\n- **Load balancing**: Distribute the load across multiple servers\n- **Redundancy**: Continue receiving events even if one bridge fails\n- **Different sources**: Connect to bridges from different providers or regions\n\nEach event bridge connection:\n\n- Is managed independently\n- Has its own reconnection logic\n- Shows its status in logs with the bridge name prefix\n- Continues to work even if other bridges fail\n\nExample log output:\n\n```\n[primary] Connected to event bridge\n[secondary] Connection state changed to: connecting\n[primary] Event from room 明前奶绿 (25034104): message\n[secondary] Event from room 明前奶绿 (25034104): gift\n```\n\n## Prerequisites\n\n- [Bun](https://bun.sh) runtime installed\n- Telegram Bot Token from [@BotFather](https://t.me/botfather)\n- Telegram API ID and Hash from [my.telegram.org](https://my.telegram.org)\n- One or more LAPLACE Event Bridge WebSocket server URLs\n- Telegram channel IDs for forwarding events\n\n## Installation\n\nTo install dependencies:\n\n```bash\nbun install\n```\n\n## Configuration\n\n1. Copy `config.example.yaml` to `config.yaml`:\n\n```bash\ncp config.example.yaml config.yaml\n```\n\n2. Create a `.env` file with your Telegram bot credentials:\n\n```ini\n# Telegram Bot Configuration\nTELEGRAM_API_ID=your_telegram_api_id\nTELEGRAM_API_HASH=your_telegram_api_hash\nTELEGRAM_BOT_TOKEN=your_bot_token\n```\n\n3. Update `config.yaml` with your settings:\n\n```yaml\n# LAPLACE Event Bridge connection settings\nbridges:\n  - name: primary\n    url: wss://your-websocket-server.com\n    token: optional_authentication_key\n\n  - name: secondary\n    url: wss://another-server.com\n    token: another_token\n\n# Room configurations\nrooms:\n  - room_id: 25034104\n    uid: 2132180406 # Streamer's UID\n    slug: 明前奶绿\n    vip_users: []\n    telegram_announce_ch: -12345\n    telegram_watchers_ch: -12345\n    # Optional: Minimum gift price to notify (in coins, 1000 = 1 CNY, default: 100000)\n    minimum_gift_price: 100000\n    # Optional: Minimum guard price to notify (in coins, 1000 = 1 CNY, default: 200000)\n    minimum_guard_price: 200000\n    # Optional: Whether to notify room enter events (default: false)\n    notify_room_enter: false\n    # Optional: Only notify when VIP users enter (default: false)\n    notify_watched_users_only: false\n    # Optional: Specific bridge name to monitor this room (if not specified, all bridges will monitor)\n    bridge: primary\n```\n\n### Configuration Fields\n\n#### Event Bridge Settings\n\n- `name`: Unique identifier for the connection (used in logs)\n- `url`: WebSocket URL for LAPLACE Event Bridge\n- `token`: Optional authentication token\n\n#### Room Settings\n\n- `room_id`: The LAPLACE room ID to monitor\n- `slug`: Human-readable name for the room\n- `uid` (optional): Streamer's UID (helps identify streamer messages)\n- `show_slug` (optional): Whether to show room slug in messages (default: true)\n- `vip_users`: List of VIP user IDs (messages from these users are forwarded)\n- `telegram_announce_ch`: Telegram channel ID for message events\n- `telegram_watchers_ch`: Telegram channel ID for gift and monetary events\n- `minimum_gift_price` (optional): Minimum gift value to notify in coins (1000 = 1 CNY, default: 100000)\n- `minimum_guard_price` (optional): Minimum guard purchase value to notify in coins (default: 200000)\n- `notify_room_enter` (optional): Whether to notify room enter events (default: false)\n- `notify_watched_users_only` (optional): Only notify when VIP users enter (default: false)\n- `bridge` (optional): Specific bridge name to monitor this room. If not specified, all bridges will monitor it (may result in duplicate events)\n\n### Configuration Loading Details\n\nThe bot loads configuration from multiple sources:\n\n#### Environment Variables\n\nRequired environment variables (loaded from `.env` file or system environment):\n\n- `TELEGRAM_API_ID`: Your Telegram API ID from [my.telegram.org](https://my.telegram.org)\n- `TELEGRAM_API_HASH`: Your Telegram API Hash from [my.telegram.org](https://my.telegram.org)\n- `TELEGRAM_BOT_TOKEN`: Your bot token from [@BotFather](https://t.me/botfather)\n\n#### Configuration File\n\nThe bot expects a `config.yaml` file in the working directory. This file contains:\n\n1. **Event Bridge Connections**: WebSocket URLs and authentication tokens\n2. **Room Configurations**: Room IDs, channel mappings, and filtering rules\n\nThe configuration is loaded at startup and currently requires a restart to reload changes.\n\n## Usage\n\n### Local Development\n\nTo run the bot locally:\n\n```bash\nbun run src/index.ts\n```\n\nFor hot reload during development:\n\n```bash\nbun run dev\n```\n\nOr using the start script:\n\n```bash\nbun run start\n```\n\n### Docker Deployment\n\nThe bot can be deployed using Docker for production environments.\n\n#### Build the Docker Image\n\n```bash\n# Build for local use\ndocker buildx bake build-local\n\n# Or build using docker directly\ndocker build -t ghcr.io/laplace-live/jupiter:local .\n```\n\n#### Run with Docker\n\n```bash\n# Run with mounted config file and environment variables\ndocker run -d \\\n  --name laplace-jupiter \\\n  -v $(pwd)/config.yaml:/app/config.yaml:ro \\\n  -v $(pwd)/bot-data:/app/bot-data \\\n  -e TELEGRAM_API_ID=your_telegram_api_id \\\n  -e TELEGRAM_API_HASH=your_telegram_api_hash \\\n  -e TELEGRAM_BOT_TOKEN=your_bot_token \\\n  ghcr.io/laplace-live/jupiter:local\n```\n\n#### Using Docker Compose\n\nCreate a `docker-compose.yml` file:\n\n```yaml\nversion: '3.8'\n\nservices:\n  jupiter:\n    image: ghcr.io/laplace-live/jupiter:latest\n    container_name: laplace-jupiter\n    restart: unless-stopped\n    environment:\n      - TELEGRAM_API_ID=${TELEGRAM_API_ID}\n      - TELEGRAM_API_HASH=${TELEGRAM_API_HASH}\n      - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}\n    volumes:\n      - ./config.yaml:/app/config.yaml:ro\n      - ./bot-data:/app/bot-data\n```\n\nThen run:\n\n```bash\n# Create .env file with your credentials\necho \"TELEGRAM_API_ID=your_telegram_api_id\" \u003e .env\necho \"TELEGRAM_API_HASH=your_telegram_api_hash\" \u003e\u003e .env\necho \"TELEGRAM_BOT_TOKEN=your_bot_token\" \u003e\u003e .env\n\n# Start the container\ndocker-compose up -d\n```\n\n## Development\n\nThis project uses [Bun](https://bun.com) as its JavaScript runtime and is built with TypeScript. It leverages the [@laplace.live/event-bridge-sdk](https://www.npmjs.com/package/@laplace.live/event-bridge-sdk) for WebSocket connections and [@mtcute/bun](https://www.npmjs.com/package/@mtcute/bun) for Telegram integration.\n\n## License\n\nAGPL-3.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaplace-live%2Fjupiter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaplace-live%2Fjupiter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaplace-live%2Fjupiter/lists"}