{"id":15149873,"url":"https://github.com/jsfraz/whisper-server","last_synced_at":"2025-10-12T00:15:03.999Z","repository":{"id":243749117,"uuid":"813308975","full_name":"jsfraz/whisper-server","owner":"jsfraz","description":"Secure private self-hosted messaging server using end-to-end encryption.","archived":false,"fork":false,"pushed_at":"2025-09-28T00:27:38.000Z","size":233,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-28T02:35:51.975Z","etag":null,"topics":["end-to-end-encryption","go","golang","instant-messaging","mail","messaging-app","openapi3","postgresql","self-hosted"],"latest_commit_sha":null,"homepage":"","language":"Go","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/jsfraz.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":"2024-06-10T21:10:30.000Z","updated_at":"2025-09-23T03:21:59.000Z","dependencies_parsed_at":"2024-06-21T15:56:02.283Z","dependency_job_id":"132a41e5-ff16-4530-aa36-3582632fc58e","html_url":"https://github.com/jsfraz/whisper-server","commit_stats":{"total_commits":21,"total_committers":2,"mean_commits":10.5,"dds":"0.47619047619047616","last_synced_commit":"3de153d845750d56a04848486ddb67e64bcd195b"},"previous_names":["jsfraz/whisper-server"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jsfraz/whisper-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsfraz%2Fwhisper-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsfraz%2Fwhisper-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsfraz%2Fwhisper-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsfraz%2Fwhisper-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jsfraz","download_url":"https://codeload.github.com/jsfraz/whisper-server/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jsfraz%2Fwhisper-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279009474,"owners_count":26084609,"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","status":"online","status_checked_at":"2025-10-11T02:00:06.511Z","response_time":55,"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":["end-to-end-encryption","go","golang","instant-messaging","mail","messaging-app","openapi3","postgresql","self-hosted"],"created_at":"2024-09-26T14:01:22.736Z","updated_at":"2025-10-12T00:15:03.994Z","avatar_url":"https://github.com/jsfraz.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# whisper-server\n\nSecure private self-hosted messaging server using end-to-end encryption.\n\nFor Whisper app, see [whisper](https://github.com/jsfraz/whisper) repository.\n\nAlso see [Wiki](https://github.com/jsfraz/whisper-server/wiki)!\n\n## Development\n\n```bash\nsudo docker compose -f docker-compose.dev.yml --env-file .env.dev up -d\n```\n\n### Environment variables\n\n| Variable | Description | Required | Default value |\n| --- | --- | --- | --- |\n| GIN_MODE | Gin framework and entire application mode (debug or release) | No | debug |\n| SERVER_URL | Server URL | Yes | - |\n| SQLITE_PASSWORD | Password for the SQLite database | Yes | - |\n| VALKEY_HOST | Valkey host | Yes | - |\n| VALKEY_PORT | Valkey port | No | 6379 |\n| VALKEY_PASSWORD | Password for Valkey | Yes | - |\n| ADMIN_MAIL | Administrator email address | Yes | - |\n| ADMIN_INVITE_TTL | Administrator invitation validity period (in seconds) | No | 600 (10 minutes) |\n| INVITE_TTL | Invitation validity period (in seconds) | No | 900 (15 minutes) |\n| SMTP_HOST | SMTP host for sending emails | Yes | - |\n| SMTP_PORT | SMTP port | No | 465 |\n| SMTP_USER | SMTP username | Yes | - |\n| SMTP_PASSWORD | SMTP password | Yes | - |\n| ACCESS_TOKEN_SECRET | Secret key for access token | Yes | - |\n| ACCESS_TOKEN_LIFESPAN | Access token lifespan (in seconds) | No | 900 (15 minutes) |\n| REFRESH_TOKEN_SECRET | Secret key for refresh token | Yes | - |\n| REFRESH_TOKEN_LIFESPAN | Refresh token lifespan (in seconds) | No | 604800 (7 days) |\n| WS_ACCESS_TOKEN_SECRET | Secret key for short-lived WebSocket access token | Yes | - |\n| WS_ACCESS_TOKEN_LIFESPAN | WebSocket access token lifetime (in seconds) | No | 10 (10 seconds) |\n| MESSAGE_TTL | Message retention time (in seconds) | No | 2592000 (30 days) |\n\n### Firebase\n\nVisit [docs](https://firebase.google.com/docs/admin/setup) to set up Firebase Admin SDK and export Firebase credentials in `.json` file that you will need later. (mentioned in `docker-compose.prod.yml`)\n\n## CI/CD Deployment\n\nThe application uses GitHub Actions to automatically build and deploy when pushing to the main branch. For this process to work correctly, the following secret keys must be set in the repository settings (Settings \u003e Secrets and variables \u003e Actions):\n\n| Secret | Description |\n| --- | --- |\n| VPS_HOST | IP address or domain name of the VPS server |\n| VPS_USERNAME | Username for SSH access |\n| VPS_SSH_KEY | Private SSH key for server access |\n| VPS_PORT | SSH port (usually 22) |\n| PROJECT_PATH | Absolute path to the directory to clone the project to on the VPS server |\n| FIREBASE_JSON_BASE64 | Contents of the firebase.json file encoded in base64 |\n\nAnd other variables listed in [Environment variables](#environment-variables).\n\nTo get `FIREBASE_JSON_BASE64`, run:\n\n- **Linux/macOS**: `base64 -w 0 \u003c firebase.json` (copy the output)\n- **Windows**: `[Convert]::ToBase64String([IO.File]::ReadAllBytes(\"firebase.json\"))` (in PowerShell)\n\n### Setting up an SSH key\n\n1. Generate a new SSH key pair without a password:\n\n```bash\n   ssh-keygen -t ed25519 -C “github-actions” -f ~/.ssh/github_actions_key\n```\n\n2. Add the public key to the server in the `~/.ssh/authorized_keys` file:\n\n```bash\n   ssh-copy-id -i ~/.ssh/github_actions_key.pub -p your_ssh_port user@your_server\n```\n\n3. Copy the contents of the private key (`~/.ssh/github_actions_key`) and save it as a GitHub Secret named `VPS_SSH_KEY`.\n\n### Reverse proxy\n\nFor deploying behind a reverse proxy see [nginx configuration](whisper.conf).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsfraz%2Fwhisper-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjsfraz%2Fwhisper-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjsfraz%2Fwhisper-server/lists"}