{"id":26201645,"url":"https://github.com/danielbilyk/transponster","last_synced_at":"2026-04-30T06:33:27.864Z","repository":{"id":281536444,"uuid":"943565600","full_name":"danielbilyk/Transponster","owner":"danielbilyk","description":"A Slack bot that turns audio or video into transcribed text file using ElevenLabs API.","archived":false,"fork":false,"pushed_at":"2025-06-11T10:17:23.000Z","size":56,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-11T11:37:15.656Z","etag":null,"topics":["audiotranscription","bot","elevenlabs","elevenlabs-api","elevenlabs-api-integration","slack","slack-bot","transcribing-audio","transcribing-videos"],"latest_commit_sha":null,"homepage":"","language":"Python","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/danielbilyk.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}},"created_at":"2025-03-05T23:08:44.000Z","updated_at":"2025-06-11T10:17:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"66812475-2788-446a-b161-78787e683794","html_url":"https://github.com/danielbilyk/Transponster","commit_stats":null,"previous_names":["danielbilyk/transponster"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danielbilyk/Transponster","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielbilyk%2FTransponster","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielbilyk%2FTransponster/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielbilyk%2FTransponster/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielbilyk%2FTransponster/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielbilyk","download_url":"https://codeload.github.com/danielbilyk/Transponster/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielbilyk%2FTransponster/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260151471,"owners_count":22966520,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["audiotranscription","bot","elevenlabs","elevenlabs-api","elevenlabs-api-integration","slack","slack-bot","transcribing-audio","transcribing-videos"],"created_at":"2025-03-12T03:23:02.947Z","updated_at":"2026-04-30T06:33:27.858Z","avatar_url":"https://github.com/danielbilyk.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Transponster — Audio Transcriber Bot for Slack\n\n_Because every PM needs a vibe-coding project that's not good enough for production but gets the job done nevertheless._\n\nThis is a Slack bot that turns audio or video into transcribed text file using ElevenLabs API. It can also translate `.srt` subtitle files to English using OpenAI. For all of this to work, you will need to set up [Slack](#-slack-setup), [ElevenLabs](#-elevenlabs-setup), [Google Drive](#-google-drive-integration), and then [the bot itself](#-bot-setup).\n\n---\n\n## 🧵 Slack Setup\n\n1. **Create a Slack App:**\n   - Go to [Slack API](https://api.slack.com/apps) and create a new app: \"Create New App\" → \"From scratch\"\n   - Select the workspace where you have permissions.\n\n2. **Configure OAuth \u0026 Permissions:**\n   - In the **OAuth \u0026 Permissions** section, add the following [scopes](https://api.slack.com/scopes):\n\n     **Bot Token Scopes**\n     - `channels:history`\n     - `chat:write`\n     - `files:read`\n     - `files:write`\n     - `groups:history`\n     - `mpim:history`\n     - `reactions:read`\n     - `users:read`\n\n     **User Token Scopes**\n     - `files:read`\n\n   - Still under **OAuth \u0026 Permissions**, click \"Install App\".\n   - Then, obtain the **Bot User OAuth Token** (these start with `xoxb-`).\n   - Then, under **Basic Information** section, note your **Signing Secret**.\n\n3. **Event Subscriptions:**\n   - Enable **Event Subscriptions**.\n   - Set the Request URL to your public endpoint (e.g., `https://your-domain.com/slack/events`).\n   - Subscribe to the following events:\n     - `file_shared` (for transcription)\n     - `reaction_added` (for subtitle translation)\n   - Save your changes.\n\n---\n\n## 🧬 ElevenLabs Setup\n\n1. **Sign Up \u0026 API Key:**\n   - Visit [ElevenLabs](https://elevenlabs.io) and create an account.\n   - Generate your API key from your dashboard.\n\n---\n\n## ☁️ Google Drive Integration\n\nTransponster can automatically upload your transcripts as Word documents (.docx) to a shared Google Drive. Each user gets their own folder inside the shared drive, and every transcript is saved there for easy access and sharing.\n\n### What the bot does with Google Drive:\n- Creates a shared drive (if not already present) named `Transponster`.\n- Creates a personal folder for each Slack user (by display name) inside the shared drive.\n- Uploads every transcript as a `.docx` file to your folder, so you can always find your files in Drive.\n- Shares a direct link to the file and your folder in Slack after processing.\n\n### Google Cloud Setup\n1. **Create a Google Cloud Project \u0026 Service Account:**\n   - Go to [Google Cloud Console](https://console.cloud.google.com/).\n   - Create a new project (or use an existing one).\n   - Enable the **Google Drive API** for your project.\n   - Create a **Service Account** with the `Editor` role (or at least permission to manage files in Drive).\n   - Generate a **JSON key** for the service account and download it.\n\n2. **Share the Shared Drive with the Service Account:**\n   - In Google Drive, create a shared drive named `Transponster` (or use an existing one).\n   - Share the drive with your service account's email (found in the JSON key) and give it full access.\n\n3. **Set Up the Environment Variable:**\n   - Copy the entire contents of your service account JSON key.\n   - In your `.env` file, add:\n     ```\n     GOOGLE_CREDENTIALS_JSON='{\"type\": \"service_account\", ...}'\n     ```\n     (Paste the JSON as a single line, escaping quotes as needed.)\n\n---\n\n## 🌍 Subtitle Translation\n\nTransponster can translate `.srt` subtitle files to English using OpenAI.\n\n**How to use:**\n1. Upload or have an `.srt` file in a Slack thread\n2. React to the message containing the `.srt` file with a flag emoji: 🇬🇧, 🇺🇸, or 🏴󠁧󠁢󠁥󠁮󠁧󠁿\n3. The bot will translate the subtitles and upload `{filename}-eng.srt` to the thread\n\n**Note:** Translation only works on messages inside threads, not on parent messages.\n\n---\n\n## 🤖 Bot Setup\n\n1. **Clone the Repository:**\n\n   ```\n   git clone https://github.com/danielbilyk/Transponster.git\n   cd Transponster\n   ```\n\n2. **Create Virtual Environment \u0026 Install Dependencies:**\n\n   ```\n   python3 -m venv venv\n   source venv/bin/activate    # For Windows use: venv\\Scripts\\activate\n   pip install -r requirements.txt\n   ```\n\n3. **Configure Environment Variables:**\n   - Ensure your `.env` file includes:\n   ```\n   SLACK_BOT_TOKEN=xoxb-your-slack-bot-token\n   SLACK_SIGNING_SECRET=your-slack-signing-secret\n   ELEVENLABS_API_KEY=your-elevenlabs-api-key\n   OPENAI_API_KEY=sk-your-openai-api-key\n   GOOGLE_CREDENTIALS_JSON='{\"type\": \"service_account\", ...}'\n\n   # Optional: Set a channel for the bot to post a startup message\n   SLACK_STARTUP_CHANNEL=C0XXXXXXX\n\n   # Optional: Enable debug mode (disables Google Drive uploads by default)\n   DEBUG=true\n   # Optional: Re-enable Google Drive in debug mode\n   DEBUG_GDRIVE=true\n   ```\n\n4. **Run the Bot:**\n\n   ```\n   uvicorn bot:api --host 0.0.0.0 --port 3000\n   ```\n\n   The bot will start, and you'll see logs both in your terminal and in `bot.log`.\n\n---\n\n## 🌐 Local Development\n\nTo develop locally, you need to expose your local server to the internet so that Slack can send events to your bot. I suggest using Ngrok.\n\n1. Run your bot server first:\n   \n   In one terminal, start the bot:\n   ```\n   uvicorn bot:api --host 0.0.0.0 --port 3000\n   ```\n\n2. **Use Ngrok:**\n   - Install [ngrok](https://ngrok.com/) if you haven't already.\n   - In a separate terminal window, run:\n   \n     ```\n     ngrok http 3000\n     ```\n     \n   - Ngrok will provide you with a public URL (e.g., `https://xxxxxxxx.ngrok.io`).\n\n3. **Configure Slack Event Subscriptions:**\n   - In Slack's Event Subscriptions settings, set the Request URL to:\n     \n     ```\n     https://xxxxxxxx.ngrok.io/slack/events\n     ```\n     \n   - Replace `xxxxxxxx` with your actual ngrok subdomain.\n   \nThis setup allows you to test your bot locally while Slack sends events to your exposed endpoint.\n\n---\n\n## 🐳 Deployment\n\n1. **Build the Docker Image**  \n   \n   From the project root (where `Dockerfile` is located), run:\n   ```\n   docker build -t transponster-bot .\n   ```\n\n2. **Create a `.env` File**\n\n   Make sure you have a `.env` file containing:\n   ```\n   SLACK_BOT_TOKEN=xoxb-your-slack-bot-token\n   SLACK_SIGNING_SECRET=your-slack-signing-secret\n   ELEVENLABS_API_KEY=your-elevenlabs-api-key\n   OPENAI_API_KEY=sk-your-openai-api-key\n   GOOGLE_CREDENTIALS_JSON='{\"type\": \"service_account\", ...}'\n\n   # Optional: Set a channel for the bot to post a startup message\n   SLACK_STARTUP_CHANNEL=your-slack-startup-channel\n   ```\n\n3. **Run the Container**\n   \n   Map port 3000 from the container to the host, load your `.env`, and ensure the container restarts automatically:\n   ```\n   docker run -d \\\n     --name transponster-container \\\n     --env-file .env \\\n     -p 3000:3000 \\\n     -v /path/on/host/bot.log:/app/bot.log \\\n     --restart=always \\\n     transponster-bot\n   ```\n\n4. **Confirm It’s Running**\n   - Check container logs:\n   ```\n   docker logs -f transponster-container\n   ```\n   - If you need a public HTTPS endpoint (for Slack), set up a reverse proxy (e.g., Apache/Nginx) pointing to port 3000.\n\n   You can then configure Slack to send requests to your server’s address or domain, forwarding to port 3000 if needed.\n   ```\n   https://your-domain.tld/slack/events\n   ```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielbilyk%2Ftransponster","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielbilyk%2Ftransponster","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielbilyk%2Ftransponster/lists"}