{"id":50817156,"url":"https://github.com/anibaldeboni/rapper","last_synced_at":"2026-06-13T10:31:42.122Z","repository":{"id":219167685,"uuid":"748349614","full_name":"anibaldeboni/rapper","owner":"anibaldeboni","description":"Easy to use mass HTTP request tool","archived":false,"fork":false,"pushed_at":"2026-02-10T17:02:09.000Z","size":935,"stargazers_count":3,"open_issues_count":5,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-10T21:03:29.524Z","etag":null,"topics":["cli","golang","http"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anibaldeboni.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2024-01-25T19:38:14.000Z","updated_at":"2026-02-10T17:02:18.000Z","dependencies_parsed_at":"2024-04-26T22:32:01.605Z","dependency_job_id":null,"html_url":"https://github.com/anibaldeboni/rapper","commit_stats":null,"previous_names":["anibaldeboni/rapper"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/anibaldeboni/rapper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anibaldeboni%2Frapper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anibaldeboni%2Frapper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anibaldeboni%2Frapper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anibaldeboni%2Frapper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anibaldeboni","download_url":"https://codeload.github.com/anibaldeboni/rapper/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anibaldeboni%2Frapper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34281700,"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-13T02:00:06.617Z","response_time":62,"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":["cli","golang","http"],"created_at":"2026-06-13T10:31:41.617Z","updated_at":"2026-06-13T10:31:42.114Z","avatar_url":"https://github.com/anibaldeboni.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rapper\n\n  \u003cp align=\"left\"\u003e\n  \u003cimg alt=\"GitHub License\" src=\"https://img.shields.io/github/license/anibaldeboni/rapper?logo=gnu\"\u003e\n  \u003ca href=\"https://github.com/anibaldeboni/rapper/actions/workflows/ci.yml\" rel=\"nofollow\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/actions/workflow/status/anibaldeboni/rapper/master.yml?branch=master\u0026logo=Github\" alt=\"Build\" /\u003e\n  \u003c/a\u003e\n  \u003cimg alt=\"GitHub language count\" src=\"https://img.shields.io/github/languages/count/anibaldeboni/rapper?logo=go\"\u003e\n  \u003cimg alt=\"GitHub code size in bytes\" src=\"https://img.shields.io/github/languages/code-size/anibaldeboni/rapper\"\u003e\n  \u003cimg href=\"https://github.com/anibaldeboni/rapper/releases/latest\" alt=\"GitHub Release\" src=\"https://img.shields.io/github/v/release/anibaldeboni/rapper?logo=semanticrelease\"\u003e\n  \u003c/p\u003e\n\nRapper is a powerful, configurable CLI tool to perform multiple HTTP requests based on CSV files. It features an interactive Terminal User Interface (TUI), profile management, dynamic worker pools, and real-time metrics monitoring.\n\n## Features\n\n### 🎯 Multi-View TUI Interface\n- **Files View**: Browse and select CSV files for processing\n- **Logs View**: Real-time processing logs with scroll support\n- **Settings View**: Edit configuration with live preview\n- **Workers View**: Monitor and control worker pool dynamically\n\n### 📋 Profile Management\n- Support for multiple configuration profiles (dev, staging, production, etc.)\n- Quick profile switching with `Ctrl+P`\n- Visual profile selector with active profile indicator\n- Each profile stored as separate YAML file\n\n### ⚙️ Configuration Editor\n- In-app configuration editing\n- Form fields for URL template, request body, and headers\n- Tab navigation between fields\n- Save changes with `Ctrl+S`\n- Real-time validation and unsaved changes indicator\n\n### 👷 Dynamic Worker Pool\n- Adjust worker count in real-time with arrow keys or +/-\n- Visual slider for worker count (1 to CPU count)\n- Instant feedback without restarting\n\n### 📊 Real-Time Metrics\n- Processing status indicator\n- Total requests, success/error counts\n- Lines processed from CSV\n- Throughput (requests per second)\n- Elapsed time during processing\n- Active workers count\n- Auto-refresh every 500ms\n\n### 🎨 Visual Polish\n- Toast notifications for important actions\n- Color-coded metrics (green for success, red for errors)\n- Smooth animations and transitions\n- Enhanced modal dialogs\n- Responsive layout\n\n## Installing\n\nWe provide pre-compiled binaries for Linux and MacOS (amd64 and arm64). The latest release could be found [here](https://github.com/anibaldeboni/github.com/anibaldeboni/rapper/releases/latest). After downloading a suitable binary for your system and architecture follow the commands:\n\n```shell\nchmod +x rapper-linux-amd64\nmv ./rapper-linux-amd64 ~/.local/bin/rapper\n```\n\nThe instructions above move the binary to `~./local/bin` with the name `rapper` if you have another folder mapped in `$PATH` move the app to the pertinent location.\n\n## Configuration\n\nPrior to running `rapper` you must set a `config.yml` structure is as follow:\n\n```yaml\nrequest:\n    method: POST\n    url_template: http://localhost:8080/api/users/{{.id}}\n    body_template: |\n        {\n          \"name\": \"{{.name}}\",\n          \"email\": \"{{.email}}\"\n        }\n    headers:\n        Authorization: Bearer dev-token-123456\n        Content-Type: application/json\n        Cookie: SESSID=1234\n        X-API-Version: v1\ncsv:\n    separator: ','\n    fields:\n        - id\n        - name\n        - email\nworkers: 2\n```\n\nHave in mind that when a request fails all variables selected in `csv` field will be used to form the error message, so select all variables you need to form the url and payload and any other that is relevant to identify problems when an error occur\n\n## Keyboard Shortcuts\n\n### Global Navigation\n- `F1`: Switch to Files view\n- `F2`: Switch to Logs view\n- `F3`: Switch to Settings view\n- `F4`: Switch to Workers view\n- `Ctrl+C`: Cancel operation\n- `q`: Quit application\n\n### Settings View\n- `Tab` / `Shift+Tab`: Navigate between form fields\n- `Ctrl+S`: Save configuration\n- `Ctrl+P`: Open profile selector\n- Arrow keys in form: Edit text\n- `↑` / `↓`: Navigate profile list (when profile selector is open)\n- `Enter`: Select profile (when profile selector is open)\n\n### Workers View\n- `←` / `→`: Decrease/increase worker count\n- `-` / `+`: Decrease/increase worker count\n\n### Files \u0026 Logs View\n- `↑` / `↓` / `←` / `→`: Navigate file list / Scroll logs\n\n## Usage\n\nAll options are available via `rapper -h`\n\nYou may run `rapper` directly in a directory containing a valid `config.yml` and CSV files to process. Or setting the options:\n\n```shell\n  -config string\n    \tpath to directory containing a config file (default current working dir)\n  -dir string\n    \tpath to directory containing the CSV files (default current working dir)\n  -output string\n    \tpath to output file, including the file name\n  -workers int\n    \tnumber of request workers (max: 5) (default 1)\n```\n\nA little demo of the app execution:\n![rapper usage recording](./assets/rapper.gif)\n\n# Development\n\nThe project uses a comprehensive `Makefile` for all build and development tasks. Run `make help` to see all available commands.\n\n### Building\n\nBuild the application with VCS info embedded:\n\n```shell\nmake build\n```\n\nThe binary will be created at `./build/rapper`. Version information is automatically extracted from git via `debug.ReadBuildInfo()`.\n\nOther build options:\n\n```shell\nmake dev           # Build with race detector for development\nmake release       # Build optimized binary for release\nmake build-all     # Build binaries for all platforms (Linux, macOS, Windows)\n```\n\nAfter building, copy the binary to a location in your `$PATH`:\n\n```shell\nsudo cp ./build/rapper /usr/local/bin/\n```\n\n### Testing\n\nRun tests with race detection:\n\n```shell\nmake test\n```\n\nGenerate coverage report:\n\n```shell\nmake test-coverage  # Opens coverage.html in ./build/\n```\n\nFor test assertions we use [testify](https://github.com/stretchr/testify) and [gomock](https://go.uber.org/mock) for test mocks generation.\n\n### Linting\n\nMake sure you have `golangci-lint` installed. More instructions [here](https://golangci-lint.run/usage/install/).\n\n```shell\nmake lint\n```\n\n### Other Commands\n\n```shell\nmake clean         # Remove build artifacts and cache\nmake install_deps  # Download and install dependencies\nmake mocks         # Generate mocks\nmake run           # Build and run the application\nmake all           # Run lint, test, and build\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanibaldeboni%2Frapper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanibaldeboni%2Frapper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanibaldeboni%2Frapper/lists"}