{"id":38267622,"url":"https://github.com/daisuke8000/coral","last_synced_at":"2026-01-17T01:47:42.427Z","repository":{"id":328571561,"uuid":"1111449845","full_name":"daisuke8000/coral","owner":"daisuke8000","description":"🪸 Proto dependency visualizer for gRPC/Connect projects with Neon-style interactive Web UI","archived":false,"fork":false,"pushed_at":"2025-12-23T14:54:19.000Z","size":139,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-24T09:51:09.877Z","etag":null,"topics":["github-action","grpc","protobuf","react-flow","visualization"],"latest_commit_sha":null,"homepage":"https://daisuke8000.github.io/coral/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/daisuke8000.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":"2025-12-07T00:34:16.000Z","updated_at":"2025-12-23T14:54:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/daisuke8000/coral","commit_stats":null,"previous_names":["daisuke8000/coral"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/daisuke8000/coral","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daisuke8000%2Fcoral","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daisuke8000%2Fcoral/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daisuke8000%2Fcoral/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daisuke8000%2Fcoral/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/daisuke8000","download_url":"https://codeload.github.com/daisuke8000/coral/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daisuke8000%2Fcoral/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28491636,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-17T00:50:05.742Z","status":"ssl_error","status_checked_at":"2026-01-17T00:43:11.982Z","response_time":107,"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":["github-action","grpc","protobuf","react-flow","visualization"],"created_at":"2026-01-17T01:47:42.320Z","updated_at":"2026-01-17T01:47:42.398Z","avatar_url":"https://github.com/daisuke8000.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🪸 Coral\n\nProto dependency visualizer for gRPC/Connect projects with a Neon-style interactive Web UI.\n\n[![CI](https://github.com/daisuke8000/coral/actions/workflows/ci.yml/badge.svg)](https://github.com/daisuke8000/coral/actions/workflows/ci.yml)\n\n**[Live Demo](https://daisuke8000.github.io/coral/)**\n\n## Features\n\n- **Interactive Visualization**: React Flow-based graph with zoom, pan, and explore\n- **Neon Aesthetics**: Dark mode with glow effects and animated data flow\n- **Package Grouping**: Organize nodes by package with expand/collapse functionality\n- **Auto Layout**: Automatic graph layout using Dagre algorithm\n- **Pipeline-Friendly**: `buf build -o - | coral serve` workflow\n- **GitHub Action**: Automate proto analysis in your CI/CD pipeline\n- **GitHub Pages**: Deploy interactive documentation for your proto files\n\n## Quick Start\n\n### CLI Usage\n\n```bash\n# Build from source\ngit clone https://github.com/daisuke8000/coral.git\ncd coral\ncargo build --release\n\n# Visualize proto dependencies\ncd your-proto-project\nbuf build -o - | /path/to/coral serve\n\n# Or output as JSON\nbuf build -o - | coral --output json \u003e graph.json\n```\n\n### GitHub Action\n\nAdd Coral to your workflow to automatically analyze proto dependencies on every PR:\n\n\u003e **Note**: The first run may take 3-5 minutes as it builds the Rust binary. Subsequent runs with caching will be faster.\n\n```yaml\n# .github/workflows/proto-analysis.yml\nname: Proto Analysis\n\non:\n  pull_request:\n    paths:\n      - 'proto/**'\n\njobs:\n  analyze:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      pull-requests: write\n\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Analyze Proto Dependencies\n        uses: daisuke8000/coral@v0.1.0\n        with:\n          proto-path: 'proto'\n          comment-on-pr: 'true'\n```\n\n## GitHub Action Inputs\n\n| Input | Description | Default |\n|-------|-------------|---------|\n| `proto-path` | Path to proto files directory | `proto` |\n| `buf-config` | Path to buf.yaml configuration file (relative to proto-path) | `''` |\n| `comment-on-pr` | Post analysis and diff as PR comment | `false` |\n| `github-token` | GitHub token for PR comments | `${{ github.token }}` |\n| `generate-pages` | Generate static HTML for GitHub Pages | `false` |\n\n## GitHub Action Outputs\n\n| Output | Description |\n|--------|-------------|\n| `json-path` | Path to the generated JSON file |\n| `html-path` | Path to the generated HTML directory (if generate-pages is true) |\n| `markdown-report` | Detailed markdown report of proto dependencies |\n| `diff-report` | Diff report showing changes from base branch |\n\n## Deploy to GitHub Pages\n\nDeploy an interactive visualization of your proto dependencies:\n\n```yaml\n# .github/workflows/pages.yml\nname: Deploy Proto Docs\n\non:\n  push:\n    branches: [main]\n    paths:\n      - 'proto/**'\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n\n      - name: Generate Pages\n        uses: daisuke8000/coral@v0.1.0\n        with:\n          proto-path: 'proto'\n          generate-pages: 'true'\n\n      - uses: actions/configure-pages@v4\n      - uses: actions/upload-pages-artifact@v3\n        with:\n          path: 'coral-output/html'\n\n  deploy:\n    runs-on: ubuntu-latest\n    needs: build\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    steps:\n      - uses: actions/deploy-pages@v4\n        id: deployment\n```\n\n## Node Classification\n\n| Type | Condition | Color |\n|------|-----------|-------|\n| **Service** | Contains `service` definitions | Magenta `#ff00ff` |\n| **Message** | `message` definitions | Cyan `#00ffff` |\n| **Enum** | `enum` definitions | Yellow `#ffcc00` |\n| **Package** | Package grouping nodes | Periwinkle `#8080ff` |\n| **External** | Paths starting with `google/` or `buf/` | Gray `#666666` |\n\n## Development\n\n```bash\n# Build\ncargo build --release\n\n# Test\ncargo test\n\n# Run with sample protos\ncd sandbox \u0026\u0026 buf build -o - | ../target/release/coral --output summary\n```\n\n### UI Development\n\n```bash\ncd ui\nnpm install\nnpm run dev        # Development server\nnpm run build      # Production build\nnpm run build:static  # Static build for GitHub Pages\n```\n\n## Architecture\n\n```\ncoral/\n├── src/\n│   ├── main.rs       # CLI entry point\n│   ├── lib.rs        # Public API\n│   ├── decoder.rs    # Protobuf decoding\n│   ├── analyzer.rs   # Graph analysis\n│   ├── server.rs     # Axum web server\n│   └── domain/       # Domain models\n├── ui/               # React + Vite frontend\n└── action.yml        # GitHub Action definition\n```\n\n## Data Flow\n\n```mermaid\nflowchart LR\n    subgraph Input[\"📁 Input\"]\n        Proto[\".proto files\"]\n        Buf[\"buf build -o -\"]\n    end\n\n    subgraph Backend[\"🦀 Rust Backend\"]\n        Decoder[\"decoder.rs\u003cbr/\u003e(prost_types)\"]\n        Analyzer[\"analyzer.rs\"]\n        Server[\"server.rs\u003cbr/\u003e(Axum)\"]\n    end\n\n    subgraph Output[\"📤 Output\"]\n        API[\"/api/graph\"]\n        JSON[\"graph.json\"]\n    end\n\n    subgraph Frontend[\"⚛️ React Frontend\"]\n        Fetch[\"useGraphData\"]\n        Flow[\"React Flow\"]\n        UI[\"Interactive UI\"]\n    end\n\n    Proto --\u003e Buf\n    Buf --\u003e|FileDescriptorSet| Decoder\n    Decoder --\u003e Analyzer\n    Analyzer --\u003e|GraphModel| Server\n    Analyzer --\u003e|--output json| JSON\n    Server --\u003e API\n    API --\u003e|fetch| Fetch\n    JSON -.-\u003e|static mode| Fetch\n    Fetch --\u003e Flow\n    Flow --\u003e UI\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaisuke8000%2Fcoral","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaisuke8000%2Fcoral","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaisuke8000%2Fcoral/lists"}