{"id":42057568,"url":"https://github.com/qqrm/rust-hh-feed","last_synced_at":"2026-01-26T07:17:20.304Z","repository":{"id":303651163,"uuid":"1016145255","full_name":"qqrm/rust-hh-feed","owner":"qqrm","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-10T00:23:39.000Z","size":140,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-10T22:13:02.120Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Rust","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/qqrm.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-07-08T14:55:37.000Z","updated_at":"2026-01-10T00:23:41.000Z","dependencies_parsed_at":"2025-07-08T18:51:15.994Z","dependency_job_id":"92b3e60a-8919-4f2a-a736-ef02a0016507","html_url":"https://github.com/qqrm/rust-hh-feed","commit_stats":null,"previous_names":["qqrm/rust-hh-feed"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/qqrm/rust-hh-feed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qqrm%2Frust-hh-feed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qqrm%2Frust-hh-feed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qqrm%2Frust-hh-feed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qqrm%2Frust-hh-feed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qqrm","download_url":"https://codeload.github.com/qqrm/rust-hh-feed/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qqrm%2Frust-hh-feed/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28769585,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T06:37:25.426Z","status":"ssl_error","status_checked_at":"2026-01-26T06:37:23.039Z","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-26T07:17:20.228Z","updated_at":"2026-01-26T07:17:20.296Z","avatar_url":"https://github.com/qqrm.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rust-hh-feed\n\nThis project collects job postings related to the Rust programming language from HeadHunter every 30 minutes and posts them to a Telegram channel.\nYou can join the Telegram channel at [RustHH Jobs](https://t.me/rusthhjobs).\n\n## Main Features\n\n- Query the hh.ru API for fresh vacancies using keywords such as `rust`, `rust-разработчик`, `rust-developer`, `rust-programmer`, and `rust-программист`.\n- Filter vacancies where \"Rust\" appears in the title.\n- Publish the results to a Telegram channel via a bot.\n- Schedule the process to run every 30 minutes.\n\n## Components\n\n1. **HeadHunter parser** — a Rust module that queries the API.\n2. **Collector and filter** — processes vacancies and selects relevant ones.\n3. **Telegram bot** — sends messages to the channel.\n4. **Scheduler** — triggers the collection and posting.\n\n## Documentation\n- [Project architecture](docs/README.md)\n- [Publication state storage](docs/TECHNICAL_DETAILS.md)\n\n## Configuration\nThe bot expects a few environment variables:\n\n| Variable | Purpose |\n|----------|--------------------------------------------------------------|\n| `TELEGRAM_BOT_TOKEN` | Telegram bot token |\n| `TELEGRAM_CHAT_ID` | ID of the channel to post jobs |\n| `HH_BASE_URL` | Override base URL for the HeadHunter API |\n| `TELEGRAM_API_BASE_URL` | Override base URL for the Telegram Bot API |\n| `POSTED_JOBS_PATH` | Path to the JSON file with already posted jobs |\n| `MANUAL_MODE` | Set to `true` to skip saving posted jobs |\n| `JOB_RETENTION_DAYS` | Maximum age in days to keep posted job IDs |\n\nThe file referenced by `POSTED_JOBS_PATH` is not committed to the repository. It is downloaded from the previous workflow run and uploaded back as an artifact after each execution.\n\nDuring continuous integration the workflow sets `TELEGRAM_CHAT_ID` to a development channel.\nScheduled runs and manual releases use the production chat ID.\n\nSet the `RUST_LOG` environment variable to control the logging level, for\nexample `RUST_LOG=info`.\n\nCreate a `.env` file using [`.env.example`](.env.example) as a template.\n\n## Quiet CI Logs\nWhen running CI workflows you can suppress crate download and compilation\nmessages by adding `--quiet` to the Cargo commands. For example:\n\n```\ncargo clippy --quiet --all-targets --all-features -- -D warnings\ncargo test --quiet\ncargo run --release --quiet\n```\n\nThis keeps the logs short while still printing warnings and errors.\n\n## Continuous Integration\nPull requests trigger the [`ci.yml`](.github/workflows/ci.yml) workflow that checks formatting,\nlint rules, `cargo machete`, and tests. The `post.yml` workflow\nbuilds and runs the application either on schedule or manually. After\n`ci.yml` succeeds, the `auto_merge.yml` workflow merges the pull request using the `gh` CLI.\nDependabot manages the Rust toolchain updates and the `dependabot-automerge.yml` workflow\nenables auto-merge for its pull requests after required checks pass.\n\nThe CI job caches Cargo dependencies and build artifacts to speed up subsequent\nruns. For each update to the `main` branch the same workflow uploads the latest\ncompiled binary to the [`latest`](../../releases/latest) release. You can also\ndownload artifacts directly from the workflow run page.\n\nAdditional workflows automate repository maintenance:\n\n- `pr_cleanup.yml` cancels running CI jobs and deletes the branch after a pull request is merged while skipping its own run.\n- `manual_release.yml` allows manual execution of the bot through the GitHub UI.\n - The `cleanup-old-runs` job inside `post.yml` deletes completed runs of all workflows after three days using `GITHUB_TOKEN` with the `actions: write` permission.\n\n\n## Release Binary\nA push to the `main` branch updates the `latest` release with a freshly built executable. Only one file, `rust-hh-feed`, is kept in the release. Download it with:\n\n```\ncurl -L https://github.com/\u003cowner\u003e/\u003crepo\u003e/releases/latest/download/rust-hh-feed -o rust-hh-feed\n```\n\n## License\nThis project is licensed under the [MIT](LICENSE) license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqqrm%2Frust-hh-feed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqqrm%2Frust-hh-feed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqqrm%2Frust-hh-feed/lists"}