{"id":49914704,"url":"https://github.com/anthais/glsync","last_synced_at":"2026-05-16T15:10:48.689Z","repository":{"id":349065167,"uuid":"1200979642","full_name":"anthais/glsync","owner":"anthais","description":"Two-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code.","archived":false,"fork":false,"pushed_at":"2026-04-04T03:58:28.000Z","size":0,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-04T04:07:11.505Z","etag":null,"topics":["cli","devops","gitlab","issues-as-code","markdown","nodejs","project-management","sync","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anthais.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-04-04T03:56:36.000Z","updated_at":"2026-04-04T04:04:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/anthais/glsync","commit_stats":null,"previous_names":["anthais/glsync"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/anthais/glsync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthais%2Fglsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthais%2Fglsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthais%2Fglsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthais%2Fglsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anthais","download_url":"https://codeload.github.com/anthais/glsync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anthais%2Fglsync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33107653,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["cli","devops","gitlab","issues-as-code","markdown","nodejs","project-management","sync","typescript"],"created_at":"2026-05-16T15:10:38.004Z","updated_at":"2026-05-16T15:10:48.679Z","avatar_url":"https://github.com/anthais.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# glsync\n\nTwo-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code — version-controlled, diffable, and editable in your favorite editor.\n\n## Features\n\n- **Two-way sync** — pull from GitLab, edit locally, push back\n- **Hash-based conflict detection** — never accidentally overwrite someone else's changes\n- **Issues as Code** — store issues, milestones, and labels as Markdown files with YAML frontmatter\n- **Git-friendly** — `.md` files are tracked in git, so your team shares the same view\n- **Self-hosted GitLab support** — works with any GitLab instance\n\n## Quick Start\n\n```bash\nnpm install -g @anthais/glsync\n\ncd your-project\nglsync init       # auto-detects git remote, prompts for token\nglsync pull       # pull issues, milestones, labels as .md files\n# edit files in .gitlab/issues/, .gitlab/milestones/, .gitlab/labels/\nglsync diff       # preview changes\nglsync push       # push changes back to GitLab\n```\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `glsync init` | Initialize config (auto-detect git remote, prompt for token) |\n| `glsync fetch` | Fetch latest data from GitLab to local cache |\n| `glsync pull` | Pull and write `.md` files from GitLab |\n| `glsync diff` | Show diff between local files and GitLab |\n| `glsync push` | Push local changes to GitLab |\n\n### Options\n\n```\n-r, --resource \u003ctype\u003e   Sync only: issues, milestones, or labels\n--force                 Overwrite without conflict check\n--backup                Create .bak file before overwriting (pull only)\n--yes                   Skip confirmation prompt (push only)\n```\n\n## File Structure\n\nAfter `glsync pull`, your project will look like:\n\n```\n.gitlab/\n├── issues/\n│   ├── 21.research-auto-time-tracking.md\n│   └── 42.setup-ci-pipeline.md\n├── milestones/\n│   └── sprint-1.md\n├── labels/\n│   ├── bug.md\n│   └── feature.md\n└── .glsync/              # gitignored — config \u0026 cache\n    ├── config.json\n    └── objects/\n```\n\nEach file uses YAML frontmatter + Markdown body:\n\n```markdown\n---\nid: 42\niid: 10\ntitle: Setup CI pipeline\nlabels:\n  - devops\n  - high-priority\nmilestone: Sprint 1\nstate: opened\n---\n\nConfigure GitLab CI/CD for the monorepo...\n```\n\n## How It Works\n\nglsync uses SHA-256 hashes to track changes on both sides:\n\n- **`base_hash`** — snapshot from the last pull\n- **`server_hash`** — latest state on GitLab\n- **`local_hash`** — current state of your local file\n\n```\nPush: local changed + server unchanged → safe to push\n      local changed + server changed   → conflict (pull first)\n\nPull: server changed + local unchanged → safe to overwrite\n      server changed + local changed   → conflict (use --force or --backup)\n```\n\nNo version numbers, no timestamps — just content hashes.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanthais%2Fglsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanthais%2Fglsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanthais%2Fglsync/lists"}