{"id":42066043,"url":"https://github.com/z0rr0/smerge","last_synced_at":"2026-01-26T08:12:22.715Z","repository":{"id":268763698,"uuid":"905143875","full_name":"z0rr0/smerge","owner":"z0rr0","description":"Subscriptions merge tool","archived":false,"fork":false,"pushed_at":"2025-08-07T18:13:37.000Z","size":285,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-13T13:12:21.376Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/z0rr0.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}},"created_at":"2024-12-18T08:49:19.000Z","updated_at":"2025-08-07T18:13:23.000Z","dependencies_parsed_at":"2024-12-18T19:39:16.458Z","dependency_job_id":"62916c7a-b1f4-4671-a433-3664b345cc80","html_url":"https://github.com/z0rr0/smerge","commit_stats":null,"previous_names":["z0rr0/smerge"],"tags_count":46,"template":false,"template_full_name":null,"purl":"pkg:github/z0rr0/smerge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0rr0%2Fsmerge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0rr0%2Fsmerge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0rr0%2Fsmerge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0rr0%2Fsmerge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/z0rr0","download_url":"https://codeload.github.com/z0rr0/smerge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/z0rr0%2Fsmerge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28770251,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T07:45:00.504Z","status":"ssl_error","status_checked_at":"2026-01-26T07:45:00.070Z","response_time":59,"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":[],"created_at":"2026-01-26T08:12:22.197Z","updated_at":"2026-01-26T08:12:22.710Z","avatar_url":"https://github.com/z0rr0.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SMerge\n\n![Go](https://github.com/z0rr0/smerge/workflows/Go/badge.svg)\n![Version](https://img.shields.io/github/tag/z0rr0/smerge.svg)\n![License](https://img.shields.io/github/license/z0rr0/smerge.svg)\n\nSubscriptions merge tool.\n\nIt's a web service that joins data from multiple stealth proxy subscriptions and provides it in a single endpoint.\nIt can decode and encode data in base64 format and supports groups update periods.\n\n## Build\n\n```bash\nmake build\n```\n\nOr using docker:\n\n```bash\nmake docker\n```\n\nTest coverage:\n\n```bash\nmake test\n...\nok      github.com/z0rr0/smerge         (cached)        coverage: 56.7% of statements\nok      github.com/z0rr0/smerge/cfg     (cached)        coverage: 92.1% of statements\nok      github.com/z0rr0/smerge/crawler (cached)        coverage: 91.4% of statements\nok      github.com/z0rr0/smerge/limiter (cached)        coverage: 100.0% of statements\nok      github.com/z0rr0/smerge/server  (cached)        coverage: 95.2% of statements\n```\n\n## Run\n\n```bash\n./smerge -help\nUsage of ./smerge:\n  -config string\n        configuration file (default \"config.json\")\n  -dev\n        development mode\n  -version\n        show version\n```\n\nOr using docker\n\n- directory `data` on host should contain `config.json`\n- port `43210` on host should be free\n- `user` ID can be changed to the current user ID on the host\n\n```bash\ndocker run -d \\\n  --name smerge \\\n  --user 1000:1000 \\\n  -p 43210:43210 \\\n  -v $(pwd)/data:/data:ro \\\n  --restart unless-stopped \\\n  z0rr0/smerge:latest\n```\n\nOr using [docker-compose](https://github.com/z0rr0/smerge/blob/main/docker-compose.yml):\n\n```bash\ndocker compose up -d\n```\n\n## Configuration\n\nAn example of JSON configuration file can be found in\n[config.json](https://github.com/z0rr0/smerge/blob/main/config.json).\n\n### Command Line Flags\n\n- `-version`: Show version information\n- `-dev`: Enable development mode\n- `-config`: Path to configuration file (default: \"config.json\")\n\n### Main Configuration\n\n- `host` (string): Hostname for the server\n- `port` (uint16): Port for the server\n- `user_agent` (string): User agent string for HTTP requests\n- `timeout` (Duration): Global timeout for requests\n- `root` (string, optional): Root directory for local subscriptions\n- `retries` (uint8): Number of retries for failed requests\n- `debug` (bool): Enable debug mode\n- `limiter` (LimitOptions): Rate limiting options\n- `groups` ([]Group): Array of subscription groups\n\n### Limits configuration (`LimitOptions`)\n\n- `max_concurrent` (uint32, min: 1): Maximum number of concurrent subscription goroutines\n- `rate` (float64, min: 0): Rate limit for requests (0 = no limit)\n- `burst` (float64, min: 0): Burst size for rate limiting (0 = no rate limit)\n- `interval` (Duration): Interval for rate limiting\n- `clean_interval` (Duration): Interval for cleaning up old rate limiters\n- `exclude` ([]string): Exclude list of IPs for rate limiting\n\n### Group Configuration (`Group`)\n\n- `name` (string): Name of the group (must be unique)\n- `endpoint` (string): HTTP endpoint for the group (must be unique)\n- `encoded` (bool): Whether the group response should be encoded\n- `period` (Duration, min: 1s): Refresh period for the group\n- `subscriptions` ([]Subscription): Array of subscriptions for the group\n\n### Subscription Configuration (`Subscription`)\n\n- `name` (string): Name of the subscription (must be unique within a group)\n- `url` (string): URL or file path of the subscription\n- `encoded` (bool): Whether the subscription data is encoded\n- `timeout` (Duration, min: 10ms): Timeout for subscription requests\n- `has_prefixes` ([]string, optional): List of prefixes to filter subscription values\n- `local` (bool): Whether the subscription is a local file\n\n### Special Types\n\n- `Duration`: Custom type for time durations, specified as strings like \"10s\", \"1h\", \"1h30m\"\n\n### Constraints\n\n- Minimum period for group refresh: 1 second\n- Minimum timeout for subscription refresh: 10 milliseconds\n- Local subscriptions require a docker_volume to be specified\n- Group names and endpoints must be unique\n- Subscription names must be unique within a group\n\n## License\n\nThis source code is governed by a [MIT](https://opensource.org/license/MIT)\nlicense that can be found in the [LICENSE](https://github.com/z0rr0/smerge/blob/main/LICENSE) file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fz0rr0%2Fsmerge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fz0rr0%2Fsmerge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fz0rr0%2Fsmerge/lists"}