{"id":13575415,"url":"https://github.com/nakabonne/ali","last_synced_at":"2026-01-19T08:03:40.415Z","repository":{"id":37624439,"uuid":"294836885","full_name":"nakabonne/ali","owner":"nakabonne","description":"Generate HTTP load and plot the results in real-time","archived":false,"fork":false,"pushed_at":"2023-10-21T07:19:22.000Z","size":36634,"stargazers_count":3835,"open_issues_count":26,"forks_count":148,"subscribers_count":36,"default_branch":"master","last_synced_at":"2025-04-04T14:48:54.472Z","etag":null,"topics":["benchmarking","go","load-testing","monitoring","testing-tools","tui","visualization"],"latest_commit_sha":null,"homepage":"","language":"Go","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/nakabonne.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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}},"created_at":"2020-09-12T00:11:21.000Z","updated_at":"2025-04-04T05:31:53.000Z","dependencies_parsed_at":"2022-07-14T06:40:35.319Z","dependency_job_id":"4e93931f-deba-4a85-9880-9c3ba5e87865","html_url":"https://github.com/nakabonne/ali","commit_stats":{"total_commits":239,"total_committers":18,"mean_commits":"13.277777777777779","dds":0.2510460251046025,"last_synced_commit":"ccb349ab6741c6871851e9c6b67bd546c7622d73"},"previous_names":[],"tags_count":29,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nakabonne%2Fali","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nakabonne%2Fali/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nakabonne%2Fali/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nakabonne%2Fali/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nakabonne","download_url":"https://codeload.github.com/nakabonne/ali/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248470326,"owners_count":21109202,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["benchmarking","go","load-testing","monitoring","testing-tools","tui","visualization"],"created_at":"2024-08-01T15:01:00.814Z","updated_at":"2026-01-19T08:03:40.396Z","avatar_url":"https://github.com/nakabonne.png","language":"Go","funding_links":[],"categories":["Go","\u003ca name=\"performance\"\u003e\u003c/a\u003eperformance","visualization"],"sub_categories":[],"readme":"# ali\n[![Release](https://img.shields.io/github/release/nakabonne/ali.svg?color=orange)](https://github.com/nakabonne/ali/releases/latest)\n[![Go Reference](https://pkg.go.dev/badge/github.com/nakabonne/ali.svg)](https://pkg.go.dev/github.com/nakabonne/ali)\n\nA load testing tool capable of performing real-time analysis, inspired by [vegeta](https://github.com/tsenart/vegeta) and [jplot](https://github.com/rs/jplot).\n\n![Screenshot](images/demo.gif)\n\n`ali` comes with an embedded terminal-based UI where you can plot the metrics in real-time, so lets you perform real-time analysis on the terminal.\n\n## Installation\n\nBinary releases are available through [here](https://github.com/nakabonne/ali/releases).\n\n**Via Homebrew**\n\n```bash\nbrew install nakabonne/ali/ali\n```\n\n**Via MacPorts**\n\n```bash\nsudo port selfupdate\nsudo port install ali\n```\n\n**Via APT**\n\n```bash\nwget https://github.com/nakabonne/ali/releases/download/v0.7.3/ali_0.7.3_linux_amd64.deb\napt install ./ali_0.7.3_linux_amd64.deb\n```\n\n**Via RPM**\n\n```bash\nrpm -ivh https://github.com/nakabonne/ali/releases/download/v0.7.3/ali_0.7.3_linux_amd64.rpm\n```\n\n**Via Pacman**\n\n```bash\npacman -S ali\n```\n\n**Via APK**\n\nAfter [enabling the community repo](https://wiki.alpinelinux.org/wiki/Enable_Community_Repository):\n\n```bash\napk add ali\n```\n\n**Via Go**\n\nNote that you may have a problem because it downloads an untagged binary.\n```bash\ngo install github.com/nakabonne/ali@latest\n```\n\n**Via Docker**\n\n```bash\ndocker run --rm -it nakabonne/ali ali\n```\n\n## Usage\n### Quickstart\n\n```bash\nali http://host.xz\n```\nReplace `http://host.xz` with the target you want to issue the requests to.\nPress Enter when the UI appears, then the attack will be launched with default options (rate=50, duration=10s).\n\n### Options\n\n```\nali -h\nUsage:\n  ali [flags] \u003ctarget URL\u003e\n\nFlags:\n  -b, --body string                A request body to be sent.\n  -B, --body-file string           The path to file whose content will be set as the http request body.\n      --cacert string              PEM ca certificate file\n      --cert string                PEM encoded tls certificate file to use\n  -c, --connections int            Amount of maximum open idle connections per target host (default 10000)\n      --debug                      Run in debug mode.\n  -d, --duration duration          The amount of time to issue requests to the targets. Give 0s for an infinite attack. (default 10s)\n      --export-to string           Export results to the given directory\n  -H, --header stringArray         A request header to be sent. Can be used multiple times to send multiple headers.\n      --insecure                   Skip TLS verification\n      --key string                 PEM encoded tls private key file to use\n      --local-addr string          Local IP address. (default \"0.0.0.0\")\n  -M, --max-body int               Max bytes to capture from response bodies. Give -1 for no limit. (default -1)\n  -W, --max-workers uint           Amount of maximum workers to spawn. (default 18446744073709551615)\n  -m, --method string              An HTTP request method for each request. (default \"GET\")\n      --no-http2                   Don't issue HTTP/2 requests to servers which support it.\n  -K, --no-keepalive               Don't use HTTP persistent connection.\n      --query-range duration       The results within the given time range will be drawn on the charts (default 30s)\n  -r, --rate int                   The request rate per second to issue against the targets. Give 0 then it will send requests as fast as possible. (default 50)\n      --redraw-interval duration   Specify how often it redraws the screen (default 250ms)\n      --resolvers string           Custom DNS resolver addresses; comma-separated list.\n  -t, --timeout duration           The timeout for each request. 0s means to disable timeouts. (default 30s)\n  -v, --version                    Print the current version.\n  -w, --workers uint               Amount of initial workers to spawn. (default 10)\n\nExamples:\n  ali --duration=10m --rate=100 http://host.xz\n\nAuthor:\n  Ryo Nakao \u003cryo@nakao.dev\u003e\n```\n\nValid time units are \"ns\", \"us\" (or \"µs\"), \"ms\", \"s\", \"m\", \"h\".\n\n**Examples**\n\nFor basic usage:\n\n```bash\nali --rate=500 --duration=5m http://host.xz\n```\n\nFor an infinite attack:\n\n```bash\nali --duration=0 http://host.xz\n```\n\nFor an attack with the POST method:\n\n```bash\nali --body-file=/path/to/foo.json --method=POST http://host.xz\n```\n\n### Charts\nPress `l` (or `h`) to switch the displayed chart. On all charts, you can click and drag to select a region to zoom into.\n\n**Latency**\n\n![Screenshot](images/latency-chart.png)\n\nThe X-axis represents the request counts and the Y-axis represents latencies in milliseconds.\n\n**Percentiles**\n\n![Screenshot](images/percentiles-chart.png)\n\nYou can see how the 50th, 90th, 95th, and 99th percentiles are changing.\n\n**Bytes**\n\n\u003eTBA\n\n**Histogram**\n\n\u003eTBA\n\n## Features\n\n### Plot in real-time\n\n![Screenshot](images/real-time.gif)\n\n### Visualize the attack progress\nThis will help you during long tests.\n\n![Screenshot](images/progress.gif)\n\n### Mouse support\nWith the help of [mum4k/termdash](https://github.com/mum4k/termdash) can be used intuitively.\n\n![Screenshot](images/mouse-support.gif)\n\n### Export results\n\nYou can persist load test results for downstream processing.\n\n```bash\nali --export-to ./results/\n```\n\nSee [here](./docs/export.md) more details.\n\n## Acknowledgements\nThis project would not have been possible without the effort of many individuals and projects but especially [vegeta](https://github.com/tsenart/vegeta) for the inspiration and powerful API.\nBesides, `ali` is built with [termdash](https://github.com/mum4k/termdash) (as well as [termbox-go](https://github.com/nsf/termbox-go)) for the rendering of all those fancy graphs on the terminal.\nThey clearly stimulated an incentive to creation. A big \"thank you!\" goes out to all those who helped.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnakabonne%2Fali","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnakabonne%2Fali","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnakabonne%2Fali/lists"}