https://github.com/anthais/glsync
Two-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code.
https://github.com/anthais/glsync
cli devops gitlab issues-as-code markdown nodejs project-management sync typescript
Last synced: about 1 month ago
JSON representation
Two-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code.
- Host: GitHub
- URL: https://github.com/anthais/glsync
- Owner: anthais
- Created: 2026-04-04T03:56:36.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-04T03:58:28.000Z (3 months ago)
- Last Synced: 2026-04-04T04:07:11.505Z (3 months ago)
- Topics: cli, devops, gitlab, issues-as-code, markdown, nodejs, project-management, sync, typescript
- Language: TypeScript
- Homepage:
- Size: 0 Bytes
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# glsync
Two-way sync between GitLab and local Markdown files. Manage issues, milestones, and labels as code — version-controlled, diffable, and editable in your favorite editor.
## Features
- **Two-way sync** — pull from GitLab, edit locally, push back
- **Hash-based conflict detection** — never accidentally overwrite someone else's changes
- **Issues as Code** — store issues, milestones, and labels as Markdown files with YAML frontmatter
- **Git-friendly** — `.md` files are tracked in git, so your team shares the same view
- **Self-hosted GitLab support** — works with any GitLab instance
## Quick Start
```bash
npm install -g @anthais/glsync
cd your-project
glsync init # auto-detects git remote, prompts for token
glsync pull # pull issues, milestones, labels as .md files
# edit files in .gitlab/issues/, .gitlab/milestones/, .gitlab/labels/
glsync diff # preview changes
glsync push # push changes back to GitLab
```
## Commands
| Command | Description |
|---------|-------------|
| `glsync init` | Initialize config (auto-detect git remote, prompt for token) |
| `glsync fetch` | Fetch latest data from GitLab to local cache |
| `glsync pull` | Pull and write `.md` files from GitLab |
| `glsync diff` | Show diff between local files and GitLab |
| `glsync push` | Push local changes to GitLab |
### Options
```
-r, --resource Sync only: issues, milestones, or labels
--force Overwrite without conflict check
--backup Create .bak file before overwriting (pull only)
--yes Skip confirmation prompt (push only)
```
## File Structure
After `glsync pull`, your project will look like:
```
.gitlab/
├── issues/
│ ├── 21.research-auto-time-tracking.md
│ └── 42.setup-ci-pipeline.md
├── milestones/
│ └── sprint-1.md
├── labels/
│ ├── bug.md
│ └── feature.md
└── .glsync/ # gitignored — config & cache
├── config.json
└── objects/
```
Each file uses YAML frontmatter + Markdown body:
```markdown
---
id: 42
iid: 10
title: Setup CI pipeline
labels:
- devops
- high-priority
milestone: Sprint 1
state: opened
---
Configure GitLab CI/CD for the monorepo...
```
## How It Works
glsync uses SHA-256 hashes to track changes on both sides:
- **`base_hash`** — snapshot from the last pull
- **`server_hash`** — latest state on GitLab
- **`local_hash`** — current state of your local file
```
Push: local changed + server unchanged → safe to push
local changed + server changed → conflict (pull first)
Pull: server changed + local unchanged → safe to overwrite
server changed + local changed → conflict (use --force or --backup)
```
No version numbers, no timestamps — just content hashes.
## License
MIT