{"id":51002108,"url":"https://github.com/yeet-src/ciprof","last_synced_at":"2026-06-20T15:33:11.726Z","repository":{"id":361038055,"uuid":"1252806116","full_name":"yeet-src/ciprof","owner":"yeet-src","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-28T23:46:46.000Z","size":12,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-29T01:15:20.882Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","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/yeet-src.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-05-28T22:21:55.000Z","updated_at":"2026-05-28T23:46:50.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/yeet-src/ciprof","commit_stats":null,"previous_names":["yeet-src/ciprof"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/yeet-src/ciprof","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeet-src%2Fciprof","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeet-src%2Fciprof/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeet-src%2Fciprof/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeet-src%2Fciprof/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yeet-src","download_url":"https://codeload.github.com/yeet-src/ciprof/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeet-src%2Fciprof/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34576042,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-20T15:33:11.100Z","updated_at":"2026-06-20T15:33:11.717Z","avatar_url":"https://github.com/yeet-src.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ciprof\n\n![status: alpha](https://img.shields.io/badge/status-alpha-orange)\n![platform: linux](https://img.shields.io/badge/platform-linux-blue)\n![requires: eBPF](https://img.shields.io/badge/requires-eBPF-blueviolet)\n\n**Zero-instrumentation build profiler for GitHub Actions.**\n\nciprof attaches eBPF probes to the kernel's process and TCP layers, auto-detects the Actions runner process, and at the end of your job emits a structured report showing where the build time actually went — network vs CPU vs process startup overhead — broken down by step.\n\n\u003e **TIP:** No changes to your repo required. Add two steps: one at the top, one at the bottom.\n\n---\n\n## Quick start\n\n```yaml\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Start ciprof\n        run: yeet run https://github.com/yeet-src/ciprof -- --start\n\n      - uses: actions/checkout@v4\n      - run: npm ci\n      - run: npm test\n\n      - name: ciprof report\n        if: always()\n        run: yeet run https://github.com/yeet-src/ciprof -- --report\n```\n\n---\n\n## What you get\n\n```\n╔══════════════════════════════════════════════════════════════════╗\n║  ciprof  ·  ubuntu-latest  ·  total 4m 52s                      ║\n╚══════════════════════════════════════════════════════════════════╝\n\nSTEPS\n  ──────────────────────────────────────────────── wall    procs   net\n  actions/checkout@v4                               0m 08s    14    2.1 MB\n  npm ci                                            4m 12s  3241  340.8 MB\n  npm test                                          0m 32s    43    6.2 MB\n  ─────────────────────────────────────────────────────────────────\n  total                                             4m 52s  3298  349.1 MB\n\nNETWORK  (top destinations)\n  registry.npmjs.org:443 ........... 847 conns  338.1 MB ↓   npm ci\n  objects.githubusercontent.com:443   3 conns    2.1 MB ↓   checkout\n  localhost:5432 ..................  156 conns    6.2 MB ↕   npm test\n\nPROCESS OVERHEAD\n  3,298 processes spawned  ·  median lifetime 38 ms\n  top spawners:  npm (1,847)  node (892)  sh (431)  git (52)\n\nOBSERVATIONS\n  ⚠  npm ci spent an estimated 66% of step time on network.\n     Consider actions/setup-node with cache: 'npm' to skip downloads.\n  ✓  No unexpected outbound destinations detected.\n```\n\n---\n\n## How it works\n\n| Layer | Mechanism | What it captures |\n|-------|-----------|-----------------|\n| Process | `fentry/do_execveat_common` + `tp_btf/sched_process_exit` | Every exec/exit with PID, parent PID, command, argv |\n| Network | `fentry/tcp_connect` + `fexit/inet_csk_accept` + `fentry/tcp_close` | Every TCP connection with bytes sent/received |\n| Correlation | Parent-PID walk from runner process | Which step each process/connection belongs to |\n\nSteps are identified as direct children of the Actions runner process. Each subsequent child closes the previous step and opens a new one.\n\n---\n\n## Options\n\n```\n--start                 Begin profiling, fork to background\n--report                Signal daemon to stop and print the report\n--json                  Emit JSON only (no terminal formatting)\n--runner-pid \u003cpid\u003e      Override automatic runner PID detection\n```\n\n---\n\n## Requirements\n\n- Linux kernel 5.10+ (5.15+ recommended for fentry support)\n- `CAP_BPF` / root — the runner has this on GitHub Actions `ubuntu-latest`\n- `yeet` runtime installed\n- `clang` + `bpftool` for building from source\n\n---\n\n## Honest caveats\n\n- **Process timing is wall-clock**, not CPU time. A sleeping process counts the same as a computing one.\n- **Network time is inferred** from bytes transferred, not measured directly. The \"estimated X% network\" observation is a heuristic.\n- **Step boundaries** are detected from direct children of the runner PID. If the runner uses a thread pool or wrapper, attribution may be off.\n- **Argv is capped at 128 bytes** from the kernel. Long command lines are truncated.\n- **No reverse DNS.** Destinations are shown as `IP:port`. A future version could resolve them.\n- **Overhead is negligible**: ~2µs per exec/exit event, ~1µs per TCP event.\n\n---\n\n## Build from source\n\n```sh\nmake vmlinux    # generate include/vmlinux.h from running kernel\nmake            # compile ciprof.bpf.c -\u003e bin/ciprof.bpf.o\n```\n\nRequires: `clang`, `bpftool`, kernel headers.\n\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeet-src%2Fciprof","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyeet-src%2Fciprof","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeet-src%2Fciprof/lists"}