{"id":30376623,"url":"https://github.com/blablatdinov/croniq","last_synced_at":"2025-08-20T15:01:55.802Z","repository":{"id":296395914,"uuid":"992875398","full_name":"blablatdinov/croniq","owner":"blablatdinov","description":"Modern open-source job scheduler with cron syntax, web UI, and REST API. Built with Elixir \u0026 Phoenix.","archived":false,"fork":false,"pushed_at":"2025-08-18T20:57:22.000Z","size":1255,"stargazers_count":9,"open_issues_count":3,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-18T22:32:55.548Z","etag":null,"topics":["automation","background-jobs","cron","cron-jobs","devops","elixir","http","job-scheduler","phoenix","scheduler","task-scheduler","webhooks"],"latest_commit_sha":null,"homepage":"https://croniq.ilaletdinov.ru","language":"Elixir","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/blablatdinov.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}},"created_at":"2025-05-29T21:10:21.000Z","updated_at":"2025-08-18T20:57:10.000Z","dependencies_parsed_at":"2025-05-30T17:36:18.028Z","dependency_job_id":"b0e55e2a-bd43-49e7-ba83-1df67f0a2ce7","html_url":"https://github.com/blablatdinov/croniq","commit_stats":null,"previous_names":["blablatdinov/croniq"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/blablatdinov/croniq","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blablatdinov%2Fcroniq","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blablatdinov%2Fcroniq/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blablatdinov%2Fcroniq/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blablatdinov%2Fcroniq/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blablatdinov","download_url":"https://codeload.github.com/blablatdinov/croniq/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blablatdinov%2Fcroniq/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271337859,"owners_count":24742057,"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-08-20T02:00:09.606Z","response_time":69,"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":["automation","background-jobs","cron","cron-jobs","devops","elixir","http","job-scheduler","phoenix","scheduler","task-scheduler","webhooks"],"created_at":"2025-08-20T15:01:27.515Z","updated_at":"2025-08-20T15:01:55.794Z","avatar_url":"https://github.com/blablatdinov.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nThe MIT License (MIT).\n\nCopyright (c) 2025 Almaz Ilaletdinov \u003ca.ilaletdinov@yandex.ru\u003e\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\nDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\nOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\nOR OTHER DEALINGS IN THE SOFTWARE.\n--\u003e\n# Croniq\n\n[![Build Status](https://img.shields.io/github/actions/workflow/status/blablatdinov/croniq/pr-check.yml?branch=master)](https://github.com/yourusername/blablatdinov/croniq)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Lines of code](https://tokei.rs/b1/github/blablatdinov/croniq?style=flat)](https://github.com/XAMPPRocky/tokei_rs)\n[![Hits-of-Code](https://hitsofcode.com/github/blablatdinov/croniq)](https://hitsofcode.com/github/blablatdinov/croniq/view)\n\n_A modern, open-source job scheduler built with Elixir and Phoenix_\n\n---\n\n## ✨ Features\n\n- **HTTP Task Scheduling**: Trigger any API endpoint on a schedule\n- **Full Cron Syntax**: Supports standard cron expressions with seconds precision\n- **Retry Mechanism**: Automatic retries with exponential backoff\n- **Web UI \u0026 REST API**: Manage jobs through both interfaces\n- **Lightweight**: Minimal resource usage\n\n---\n\n**Live demo:** [croniq.ilaletdinov.ru](https://croniq.ilaletdinov.ru)\n\nThe Croniq web interface allows you to manage scheduled jobs through a modern dashboard:\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"docs/images/screen_task_list.png\" alt=\"Task List\" width=\"350\"/\u003e\u003cbr/\u003e\n      \u003cb\u003eTask List\u003c/b\u003e\u003cbr/\u003e\n      View all jobs, their statuses, and schedules\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"docs/images/screen_create_task.png\" alt=\"Create Task\" width=\"350\"/\u003e\u003cbr/\u003e\n      \u003cb\u003eCreate Task\u003c/b\u003e\u003cbr/\u003e\n      Convenient form for creating a new job\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003cimg src=\"docs/images/screen_request_log.png\" alt=\"Request Log\" width=\"350\"/\u003e\u003cbr/\u003e\n      \u003cb\u003eRequest Log\u003c/b\u003e\u003cbr/\u003e\n      Execution history and HTTP request logs\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## 🚀 Quick Start\n\n**Requirements:**\n- Elixir 1.14+\n- PostgreSQL 12+\n- Node.js 16+ (for assets)\n\n**Installation:**\n```bash\ngit clone https://github.com/yourusername/croniq.git\ncd croniq\nmix deps.get\ncd assets \u0026\u0026 npm install \u0026\u0026 cd ..\nmix ecto.setup\nmix phx.server\n```\nVisit [http://localhost:4000](http://localhost:4000) in your browser.\n\n---\n\n## 📚 Usage\n\n### API Example: Create a New Job\n\n```bash\ncurl -X POST http://localhost:4000/api/jobs \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"name\": \"daily-backup\",\n    \"schedule\": \"0 3 * * *\",\n    \"url\": \"https://api.example.com/backup\",\n    \"method\": \"POST\",\n    \"headers\": {\n      \"Authorization\": \"Bearer your-token\"\n    },\n    \"body\": {\n      \"database\": \"production\"\n    }\n  }'\n```\n\n### List All Jobs\n\n```bash\ncurl http://localhost:4000/api/jobs\n```\n\n### Web UI\n\n- View, create, edit, and delete scheduled tasks via the web dashboard.\n- Real-time status and logs for each job.\n\n---\n\n## ⚙️ Configuration\n\n- All configuration is managed via `config/*.exs`.\n- Database settings: `config/dev.exs`, `config/prod.exs`\n- Environment variables can be used for secrets and production settings.\n\n---\n\n## 🏗️ Architecture Overview\n\n- **Elixir + Phoenix**: Robust, concurrent backend.\n- **Quantum**: Used for cron-like scheduling.\n- **Ecto**: Task persistence in PostgreSQL.\n- **HTTPoison**: Executes HTTP requests for tasks.\n\n**How it works:**\n- Each task is stored in the database and scheduled via Quantum.\n- When a task is due, Croniq sends an HTTP request as specified.\n- Retries and status updates are handled automatically.\n- Both REST API and Web UI are available for management.\n\n---\n\n## 🤝 Contributing\n\nWe welcome contributions! To get started:\n\n1. Fork the repository\n2. Create a new branch (`git checkout -b feature/my-feature`)\n3. Make your changes\n4. Commit and push (`git commit -am 'Add new feature' \u0026\u0026 git push origin feature/my-feature`)\n5. Open a Pull Request\n\n---\n\n## 🛡️ Security\n\n- All user input is validated and sanitized.\n- Built-in CSRF protection and secure session management.\n- Please report vulnerabilities via GitHub Issues.\n\n---\n\n## 🗺️ Roadmap\n\n- [ ] Task history and logs\n- [ ] Advanced authentication (OAuth, SSO)\n- [ ] Multi-tenant support\n- [ ] More integrations (Slack, Email, etc.)\n- [ ] Retry Mechanism\n\n---\n\n## ❓ FAQ\n\n**Q: Can I use custom HTTP headers?**  \nA: Yes, just specify them in the `headers` field when creating a job.\n\n---\n\n## 📄 License\n\nThis project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.\n\n---\n\n## 🔗 Links\n\n- [Elixir](https://elixir-lang.org/)\n- [Phoenix](https://www.phoenixframework.org/)\n- [Quantum](https://github.com/quantum-elixir/quantum-core)\n- [LiveView](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html)\n\n---\n\n_Made with ❤️ by the Croniq community_\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblablatdinov%2Fcroniq","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblablatdinov%2Fcroniq","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblablatdinov%2Fcroniq/lists"}