{"id":50714158,"url":"https://github.com/aaronhurt/vagaro-sync","last_synced_at":"2026-06-09T17:32:20.519Z","repository":{"id":345633741,"uuid":"1185417540","full_name":"aaronhurt/vagaro-sync","owner":"aaronhurt","description":"Simple macOS CLI to sync Vagaro and the local Calendar.app","archived":false,"fork":false,"pushed_at":"2026-03-30T15:56:04.000Z","size":83,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-30T17:40:17.717Z","etag":null,"topics":["calendar","codex","macos","vagaro"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aaronhurt.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":null,"dco":null,"cla":null}},"created_at":"2026-03-18T15:04:20.000Z","updated_at":"2026-03-30T15:56:10.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/aaronhurt/vagaro-sync","commit_stats":null,"previous_names":["aaronhurt/vagaro-sync"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/aaronhurt/vagaro-sync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aaronhurt%2Fvagaro-sync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aaronhurt%2Fvagaro-sync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aaronhurt%2Fvagaro-sync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aaronhurt%2Fvagaro-sync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aaronhurt","download_url":"https://codeload.github.com/aaronhurt/vagaro-sync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aaronhurt%2Fvagaro-sync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34118751,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"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":["calendar","codex","macos","vagaro"],"created_at":"2026-06-09T17:32:17.815Z","updated_at":"2026-06-09T17:32:20.515Z","avatar_url":"https://github.com/aaronhurt.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# vagaro-sync\n\n`vagaro-sync` is a small macOS CLI that signs into Vagaro with a real browser, fetches upcoming appointments, and syncs them into Calendar.app.\n\n## Background\n\nI schedule my appointments a year in advance at my local barber, and they use Vagaro to manage their scheduling. I've\noften wanted to be able to sync my appointments into my calendar without any manual effort.\n\nI was also looking for ane excuse to test OpenAI's Codex tool for macOS. I've used similar tooling in the past but\nwanted a real-world useful project to explore Codex.\n\nI used Codex from the very beginning, just feeding it HAR exports from my browser, and a few curl commands to discover\nthe non-published Vagaro API. This was by far the biggest win so far in using Codex. The discovery and research saved\na lot of time. The initial code scaffolding and time to working prototype was faster than I could have done manually.\n\nNow, for the not so good. I had to spend quite a bit of time getting Codex/GPT-5.4 to create code that I would be\ncomfortable maintaining without the use of an agentic assistant. Codex really wanted to provide test coverage for\n_everything_, including stdlib functions and string checks against the generated javascript code. They were tests for\ntesting/coverage sake that provided little to no value and would have been hard to maintain.\n\nIn addition to test coverage, Codex also had a problem with code simplification. It loved to abstract things into functional\narguments and build-in \"future flexibility\" that would never be needed in this tool.\n\nAll-in-all, it was a good experience, and I came away with a working CLI that I can use to sync my appointments.\n\n## Requirements\n\n- macOS\n- Go 1.26+\n- Google Chrome or Chromium\n- Calendar.app\n\nAuthentication is stored in the macOS keychain. Local sync state is stored at:\n\n`~/Library/Application Support/vagaro-sync/state.json`\n\n## Build\n\n```bash\ngo build .\n```\n\nThis produces the `vagaro-sync` binary in the repo root.\n\n## Usage\n\nAuthenticate once:\n\n```bash\n./vagaro-sync auth-login\n```\n\n`auth-login` stores authentication only when the browser capture yields a well-formed, non-expired JWT.\n\nSync appointments into the `Vagaro Appointments` calendar:\n\n```bash\n./vagaro-sync sync\n```\n\nClear stored authentication:\n\n```bash\n./vagaro-sync auth-clear\n```\n\n## Notes\n\n- `sync` creates the `Vagaro Appointments` calendar if it does not exist.\n- Re-running `sync` is incremental: unchanged appointments are skipped, changed appointments are updated, and missing calendar events are recreated.\n- If the stored token is missing, malformed, or expired, re-run `./vagaro-sync auth-login`.\n- Local-only integration tests are build-tagged and are not intended for CI:\n\n```bash\ngo test -tags=integration ./...\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faaronhurt%2Fvagaro-sync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faaronhurt%2Fvagaro-sync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faaronhurt%2Fvagaro-sync/lists"}