A .NET 10 CLI tool and real-time dashboard for monitoring GitLab CI/CD pipeline activity across all projects in a group. Features include SSE-powered dashboard, AI-powered failure analysis with GitHub Copilot, dynamic group selection, and enhanced job log rendering.
$ dotnet add package GitLabSummaryCLIA .NET 10 CLI tool and real-time dashboard for monitoring GitLab CI/CD pipeline activity across all projects in a group.
📚 Complete Documentation — Installation, guides, API reference, and more
--watch 30 or --watch 1m)Run the dashboard with Docker in seconds:
Using docker-compose (Recommended):
# 1. Create .env file with your tokens
cat > .env << EOF
GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx
GITLAB_URL=https://gitlab.example.com
GITLAB_GROUP=your-group-id
GH_TOKEN=github_pat_your_token_here
EOF
# 2. Download docker-compose.yml
curl -O https://raw.githubusercontent.com/garrardkitchen/gitlab-summary/main/docker-compose.yml
# 3. Start the dashboard
docker-compose up -d
# 4. Access the dashboard
open http://localhost:5100
Using docker run:
# Linux/Windows - named volume (Docker manages storage location)
docker run -d \
--name gitlab-summary \
-p 5100:5100 \
-e GITLAB_TOKEN="glpat-xxxxxxxxxxxxxxxxxxxx" \
-e GITLAB_URL="https://gitlab.example.com" \
-e GITLAB_GROUP="your-group-id" \
-e GH_TOKEN="github_pat_your_token_here" \
-v gitlab-summary-data:/home/ubuntu/.local/share/gitlab-summary \
garrardkitchen/gitlab-summary:latest
# macOS - bind mount to specific directory
docker run -d \
--name gitlab-summary \
-p 5100:5100 \
-e GITLAB_TOKEN="glpat-xxxxxxxxxxxxxxxxxxxx" \
-e GITLAB_URL="https://gitlab.example.com" \
-e GITLAB_GROUP="your-group-id" \
-e GH_TOKEN="github_pat_your_token_here" \
-v ~/.gitlab-summary:/home/ubuntu/.local/share/gitlab-summary \
garrardkitchen/gitlab-summary:latest
# Access the dashboard at http://localhost:5100
📋 Token Setup:
Settings → Access Tokens with read_api scope📚 See Docker Documentation for detailed setup, production deployment, and troubleshooting.
dotnet tool install -g GitLabSummary
To update to the latest version:
dotnet tool update -g GitLabSummary
Download pre-built executables from the Releases page:
gitlab-summary-win-x64.exegitlab-summary-osx-arm64gitlab-summary-osx-x64gitlab-summary-linux-x64# Clone the repository
git clone https://github.com/garrardkitchen/gitlab-summary.git
cd gitlab-summary
# Build the dashboard
cd src/dashboard
npm install
npm run build
# Build the CLI
cd ../cli
dotnet build
read_api scopegh auth login# Start the dashboard (assumes .env file exists)
docker-compose up -d
# View logs
docker-compose logs -f
# Stop the dashboard
docker-compose down
# Access at: http://localhost:5100
# Store your GitLab token securely
gitlab-summary token set --url https://gitlab.example.com
# View pipeline summary (last 24 hours)
gitlab-summary pipelines --group my-org
# View detailed breakdown
gitlab-summary pipelines --group my-org --since 2d --detailed
# Filter to a specific project
gitlab-summary pipelines --group my-org --project api-service --since 12h
# Watch mode - auto-refresh every 30 seconds
gitlab-summary pipelines --group my-org --watch 30
# Watch mode - auto-refresh every 1 minute
gitlab-summary pipelines --group my-org --watch 1m --detailed
# Start the real-time dashboard (opens browser automatically)
gitlab-summary serve --group my-org --open
The full documentation includes:
# Start the SSE server + open browser
dotnet run --project src/cli/GitLabSummary -- serve --group my-org --open
# In another terminal, start the Vue dev server
cd src/dashboard
npm install
npm run dev
# → http://localhost:3000 (proxies API to localhost:5100)
# Or build and serve from CLI (port 5100 serves built dashboard)
npm run build
# Restart serve command → http://localhost:5100
You must pull the repo 1st and install the gitlab-summary tool from nuget as shown above
To run from one line:
(cd src/dashboard && npm run dev) & (cd ../.. && gitlab-summary serve --group 2217 --open)
token set [--url <URL>]Store or update your GitLab access token. Prompts for masked input.
token showDisplay the stored token (masked) and configured GitLab URL.
token clearRemove the stored token.
url set --url <URL>Set the GitLab instance URL.
url showDisplay the configured GitLab URL.
pipelines --group <GROUP> [OPTIONS]Show pipeline activity summary.
| Option | Description | Default |
|---|---|---|
-g, --group | GitLab group ID or path | Required |
-s, --since | Time range (30m, 24h, 7d) | 24h |
-p, --project | Filter by project name | — |
-d, --detailed | Show per-pipeline details | false |
-w, --watch | Auto-refresh every N seconds/minutes (30, 1m, 5m) | — |
-u, --url | Override GitLab URL | Config value |
serve --group <GROUP> [OPTIONS]Start SSE dashboard server. Dashboard URL: http://localhost:5100 (or custom port)
| Option | Description | Default |
|---|---|---|
-g, --group | GitLab group ID or path | Required |
-s, --since | Time range | 24h |
--port | Server port | 5100 |
--open | Open browser automatically | false |
--interval | Refresh interval (seconds) | 30 |
--ai-model | Copilot model for AI analysis | claude-sonnet-4-5 |
-u, --url | Override GitLab URL | Config value |
| Endpoint | Method | Description |
|---|---|---|
/api/events/pipelines | GET | SSE stream of pipeline summaries |
/api/pipelines/summary | GET | Current summary snapshot |
/api/pipelines/{projectId}/details/{pipelineId} | GET | Pipeline job details |
/api/health | GET | Health check |
/api/version | GET | Version information |
/api/avatar?url={url} | GET | Proxy for GitLab avatars |
| Endpoint | Method | Description |
|---|---|---|
/api/settings | GET | Get current group and period |
/api/settings | POST | Update group and period (body: {group, since}) |
| Endpoint | Method | Description |
|---|---|---|
/api/groups/{groupIdOrPath} | GET | Get group details |
/api/groups/{groupIdOrPath}/subgroups | GET | Get child groups |
/api/groups/parent/{parentId} | GET | Get sibling groups by parent ID |
| Endpoint | Method | Description |
|---|---|---|
/api/ai/analyse | POST | Analyze failed job (body: {projectId, pipelineId, jobId, jobName, stage, log?}) |
/api/ai/followup | POST | Ask follow-up question (body: {projectId, pipelineId, jobId, jobName, stage, question, log?, previousAnalysis?}) |
/api/ai/analyzed | GET | Get list of analyzed job IDs for project (query: projectId) |
/api/ai/cache | GET | Get cached analysis (query: projectId, jobId) |
/api/ai/cache | DELETE | Delete cached analysis (query: projectId, jobId) |
/api/ai/system-prompt | GET | Get current AI system prompt |
/api/ai/system-prompt | PUT | Update AI system prompt (body: {prompt}) |
| Endpoint | Method | Description |
|---|---|---|
/api/jobtrace | GET | Get job log trace (query: projectId, jobId) |
src/
├── cli/ # .NET 10 Console App
│ ├── GitLabSummary/ # Main project
│ │ ├── Commands/ # CLI command handlers
│ │ ├── Models/ # Data models
│ │ ├── Services/ # API client, aggregation, credentials, AI
│ │ ├── Rendering/ # Spectre.Console output formatters
│ │ └── Configuration/ # App settings
│ └── GitLabSummary.Tests/
└── dashboard/ # Vite + Vue 3 + Vuetify
└── src/
├── composables/ # SSE stream, AI analysis, formatters
├── components/ # Vue components (dialogs, detail views)
├── pages/ # Route pages (Overview, Projects, Contributors)
└── types/ # TypeScript interfaces
## Configuration
### Token Storage
Tokens are stored securely using platform-specific APIs:
- **macOS**: Keychain
- **Windows**: DPAPI (Data Protection API)
- **Linux**: .NET DataProtection with file-based key storage
### Settings File
Located at `~/.gitlab-summary/settings.json`:
```json
{
"GitLabUrl": "https://gitlab.example.com"
}
Located at ~/.gitlab-summary/ai-analysis-cache.json — stores analysis results per job.
MIT