{"id":37212746,"url":"https://github.com/ryodocx/ical-proxy","last_synced_at":"2026-01-15T00:30:29.549Z","repository":{"id":45802341,"uuid":"513135843","full_name":"ryodocx/ical-proxy","owner":"ryodocx","description":"A proxy server convert from any sources to iCalendar via OPA/Rego","archived":false,"fork":false,"pushed_at":"2024-11-07T07:43:10.000Z","size":489,"stargazers_count":3,"open_issues_count":8,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-14T23:05:05.853Z","etag":null,"topics":["ical","icalendar","ics","opa","openpolicyagent","rego"],"latest_commit_sha":null,"homepage":"","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/ryodocx.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":"2022-07-12T12:36:42.000Z","updated_at":"2024-10-09T23:42:42.000Z","dependencies_parsed_at":"2023-12-05T15:27:24.220Z","dependency_job_id":"42c33de5-6c7f-49c6-8955-faf3827ffcd3","html_url":"https://github.com/ryodocx/ical-proxy","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/ryodocx/ical-proxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryodocx%2Fical-proxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryodocx%2Fical-proxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryodocx%2Fical-proxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryodocx%2Fical-proxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryodocx","download_url":"https://codeload.github.com/ryodocx/ical-proxy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryodocx%2Fical-proxy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28439704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T22:37:52.437Z","status":"ssl_error","status_checked_at":"2026-01-14T22:37:31.496Z","response_time":107,"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":["ical","icalendar","ics","opa","openpolicyagent","rego"],"created_at":"2026-01-15T00:30:28.852Z","updated_at":"2026-01-15T00:30:29.531Z","avatar_url":"https://github.com/ryodocx.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ical-proxy\n\n[![lint](https://github.com/ryodocx/ical-proxy/actions/workflows/golangci-lint.yaml/badge.svg)](https://github.com/ryodocx/ical-proxy/actions/workflows/golangci-lint.yaml)\n[![CodeQL](https://github.com/ryodocx/ical-proxy/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/ryodocx/ical-proxy/actions/workflows/codeql-analysis.yml)\n[![Go Report Card](https://goreportcard.com/badge/github.com/ryodocx/ical-proxy)](https://goreportcard.com/report/github.com/ryodocx/ical-proxy)\n[![GoDoc](https://pkg.go.dev/badge/github.com/ryodocx/ical-proxy?status.svg)](https://pkg.go.dev/github.com/ryodocx/ical-proxy)\n\nA proxy server convert from any sources to [iCalendar](https://datatracker.ietf.org/doc/html/rfc5545) via [OPA/Rego](https://www.openpolicyagent.org/)\n\n![architecture](docs/architecture.drawio.png)\n\n## Feature\n\n* Input\n  * [x] [Redmine Issue](https://www.redmine.org/projects/redmine/wiki/Rest_Issues)\n  * [ ] [Redmine Version](https://www.redmine.org/projects/redmine/wiki/Rest_Versions)\n  * [ ] [GitLab issue]()\n  * [ ] [GitHub issue]()\n  * [ ] [RSS 1.0]()\n  * [ ] [RSS 2.0]()\n  * [ ] [Atom]()\n  * [ ] [External iCalendar]()\n  * [ ] [External OPA Server]()\n* Output\n  * [x] [iCalendar(VEVENT)](https://datatracker.ietf.org/doc/html/rfc5545)\n\n## Usage\n\n* Docker Image is [here](https://github.com/ryodocx/ical-proxy/pkgs/container/ical-proxy)\n  * `docker pull ghcr.io/ryodocx/ical-proxy:v1`\n\n### Redmine Source\n\n```sh\n# show help\n$ docker run --rm -it ghcr.io/ryodocx/ical-proxy redmine -h\n\n# edit .env\n$ cat .env\nICALPROXY_REDMINE_URL=\"https://redmine.example.com/path/\"\nICALPROXY_REDMINE_APIKEY=\"\u003credacted\u003e\"\nICALPROXY_REDMINE_QUERY=\"query_id=xxx\"\n\n# edit ./configs/ical.simple.rego\n\n# run\n$ docker compose up -d\n$ curl http://localhost:8080\n```\n\n## Subscribe\n\n* macOS\n  * https://support.apple.com/ja-jp/guide/calendar/icl1022/mac\n* Outlook\n  * https://support.microsoft.com/ja-jp/office/outlook-com-%E3%81%A7%E4%BA%88%E5%AE%9A%E8%A1%A8%E3%82%92%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E8%B3%BC%E8%AA%AD%E3%81%99%E3%82%8B-cff1429c-5af6-41ec-a5b4-74f2c278e98c\n* Google Calendar\n  * https://support.google.com/calendar/answer/37100?hl=ja\u0026co=GENIE.Platform%3DDesktop#:~:text=%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E4%B8%80%E8%88%AC%E5%85%AC%E9%96%8B%E3%81%AE%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B\n\n## Convert \u0026 Filtering\n* Use [OPA/Rego](https://www.openpolicyagent.org/)\n* OPA output is read as single VEVENT\n* VEVENT Spec: https://datatracker.ietf.org/doc/html/rfc5545#section-3.6.1\n* example: [./configs](./configs/)\n\nexpected data after through OPA\n```json\n{\n    \"allowed\": true, // if false, event is ignored\n    \"event\": {\n        \"UID\": \"\u003cUniqID\u003e\",\n        \"SUMMARY\": \"\u003ctitle\u003e\",\n        \"DTSTART;VALUE=DATE\": \"YYYYMMDD\"\n        ︙\n    }\n}\n```\n\niCal output example\n```ics\nBEGIN:VCALENDAR\nBEGIN:VEVENT\nUID:https://redmine.example.com/issues/1\nSUMMARY:subject1\nDESCRIPTION:description1\nDTSTART;VALUE=DATE:20220717\nTRANSP:TRANSPARENT\nEND:VEVENT\nBEGIN:VEVENT\nUID:https://redmine.example.com/issues/2\nSUMMARY:subject2\nDESCRIPTION:description2\nDTSTART;VALUE=DATE:20220718\nTRANSP:TRANSPARENT\nEND:VEVENT\nEND:VCALENDAR\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryodocx%2Fical-proxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryodocx%2Fical-proxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryodocx%2Fical-proxy/lists"}