GitLab CI organizes pipelines around stages and scripts; GitHub Actions organizes them around jobs and reusable Actions. Translating between the two is mostly mechanical, with two big exceptions: GitLab's implicit checkout becomes an explicit `actions/checkout@v4`, and GitLab's shell-script-only `script:` blocks must sometimes be split into multiple "step" entries (one per shell command) for clean GitHub Actions output.
The converter handles `stages`, `needs`, `rules`, `only/except`, `parallel:matrix`, `cache`, `artifacts`, `services`, and `variables`. It rewrites GitLab variables (`$CI_*`) to GitHub expressions (`${{ github.* }}`), and translates rule-based branch/tag filtering into the corresponding `on:` triggers and step-level `if:` conditions.