{"id":32136850,"url":"https://github.com/liquidaty/zsv","last_synced_at":"2026-04-02T14:31:07.449Z","repository":{"id":36970593,"uuid":"439618301","full_name":"liquidaty/zsv","owner":"liquidaty","description":"zsv+lib: tabular data swiss-army knife CLI + world's fastest (simd) CSV parser","archived":false,"fork":false,"pushed_at":"2025-10-19T13:43:16.000Z","size":12693,"stargazers_count":284,"open_issues_count":47,"forks_count":17,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-10-21T04:43:53.108Z","etag":null,"topics":["compare","csv","csv-parser","fixed","flatten","json","markdown","parser","serialize","simd","sql","sqlite3","tsv-parser","txt","wasm","web-assembly"],"latest_commit_sha":null,"homepage":"","language":"C","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/liquidaty.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":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-12-18T13:11:28.000Z","updated_at":"2025-10-21T03:08:39.000Z","dependencies_parsed_at":"2023-02-14T12:02:52.704Z","dependency_job_id":"af305aa9-5619-41ee-aa29-48370df2f33a","html_url":"https://github.com/liquidaty/zsv","commit_stats":{"total_commits":318,"total_committers":4,"mean_commits":79.5,"dds":"0.44654088050314467","last_synced_commit":"392269be5f9f3f558ad4c0caca1ff237262a370f"},"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"purl":"pkg:github/liquidaty/zsv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidaty%2Fzsv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidaty%2Fzsv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidaty%2Fzsv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidaty%2Fzsv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liquidaty","download_url":"https://codeload.github.com/liquidaty/zsv/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidaty%2Fzsv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280207179,"owners_count":26290616,"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","status":"online","status_checked_at":"2025-10-21T02:00:06.614Z","response_time":58,"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":["compare","csv","csv-parser","fixed","flatten","json","markdown","parser","serialize","simd","sql","sqlite3","tsv-parser","txt","wasm","web-assembly"],"created_at":"2025-10-21T04:44:07.151Z","updated_at":"2026-04-02T14:31:07.379Z","avatar_url":"https://github.com/liquidaty.png","language":"C","funding_links":[],"categories":["CSV","Structured File Processing","\u003ca name=\"data-management-tabular\"\u003e\u003c/a\u003eData management - Tabular data","C"],"sub_categories":["CSV"],"readme":"# zsv+lib: the world's fastest (simd) CSV parser, with an extensible CLI\n\nlib + CLI:\n[![ci](https://github.com/liquidaty/zsv/actions/workflows/ci.yml/badge.svg)](https://github.com/liquidaty/zsv/actions/workflows/ci.yml)\n![GitHub release (latest by date)](https://img.shields.io/github/v/release/liquidaty/zsv?logo=github\u0026style=flat-square)\n![GitHub all releases (downloads)](https://img.shields.io/github/downloads/liquidaty/zsv/total?logo=github\u0026style=flat-square)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/liquidaty/zsv/blob/master/LICENSE)\n\nnpm:\n[![NPM Version][npm-version-image]][npm-url]\n[![NPM Install Size][npm-install-size-image]][npm-install-size-url]\n\n[npm-install-size-image]: https://badgen.net/packagephobia/install/zsv-lib\n[npm-install-size-url]: https://packagephobia.com/result?p=zsv-lib\n[npm-url]: https://npmjs.org/package/zsv-lib\n[npm-version-image]: https://badgen.net/npm/v/zsv-lib\n\nPlayground (without `sheet` viewer command): https://liquidaty.github.io/zsv\n\nzsv+lib is [the world's fastest CSV parser](./app/benchmark/README.md) library and extensible command-line utility. It\nachieves high performance using SIMD operations, [efficient memory\nuse](docs/memory.md) and other optimization techniques, and can also parse\ngeneric-delimited and fixed-width formats, as well as multi-row-span headers.\n\nWhile `zsv` is written in C, it can be used in other languages such as [ruby](https://github.com/sebyx07/zsv-ruby). See [below](#language-bindings--wrappers) for more details.\n\n## CLI\n\nThe ZSV CLI can be compiled to virtually any target, including\n[WebAssembly](examples/js), and offers a variety of [commands](#batteries-included) including `select`, `count`,\ndirect CSV `sql`, `flatten`, `serialize`, `2json` conversion, `2db` sqlite3\nconversion, `stack`, `pretty`, `2tsv`, `compare`, `paste`, `overwrite`,\n`check` and more.\n\nThe ZSV CLI also includes [`sheet`](docs/sheet.md), an in-console interactive\ngrid viewer that includes basic navigation, filtering, and pivot table with\ndrill down, and that supports custom extensions:\n\n\u003cimg src=\"https://github.com/user-attachments/assets/c2ae32a3-48c4-499d-8ef7-7748687bd24f\" width=\"50%\"\u003e\n\n## Installation\n\n- `brew` (MacOS, Linux):\n  - `brew install zsv`\n- `winget` (Windows):\n  - `winget.exe install zsv`\n- `npm` (parser only), `nuget`, `yum`, `apt`, `choco` and more\n  - See [INSTALL.md](INSTALL.md)\n- Download\n  - Pre-built binaries and packages for macOS, Windows, Linux and BSD can be\n    downloaded from the [Releases](https://github.com/liquidaty/zsv/releases)\n    page.\n- Build\n  - See [BUILD.md](BUILD.md) to build from source\n\n## Language Bindings \u0026 Wrappers\n\nBinding [contributions](#contribute) are welcome!\n\n| Language | Project | Maintainer |\n| :--- | :--- | :--- |\n| **Ruby** | [https://github.com/sebyx07/zsv-ruby](https://github.com/sebyx07/zsv-ruby) | [@sebyx07](https://github.com/sebyx07) |\n\n\u003e **Note:** These projects are maintained independently. Please file issues related to specific bindings in their respective repositories.\n\n## Playground\n\nAn [online playground](https://liquidaty.github.io/zsv) is available as well\n(without the `sheet` feature due to browser limitations)\n\nIf you like zsv+lib, do not forget to give it a star! 🌟\n\n## Performance\n\n### Summary\n\nWe compared a number of CSV parsers on speed; memory was also tracked for informational purposes.\nThe top finalists were: `zsv`, `xan`, `polars`, `xsv`/`qsv` and `duckdb`\n\nBenchmarks use three input profiles: unquoted, sparsely quoted, standard quoted,\nand non-4180-compliant quoted.\n\nOverall, `zsv` and `xan` were the clear top performers in both speed and memory:\n- count: `zsv` is fastest across all input types\n- select: `zsv` and `zan` are the fastest, where `xan` is faster on unquoted and sparsely\n  quoted, and `zsv` is faster on standard quoted or non-4180-compliant\n- non-4180-compliant data: `zsv` is fastest across the board (`xan` and `polars` are N/A for\n  this input category)\n\n### Benchmarks\n\nSee [benchmarks](./app/benchmark/README.md)\n\nDetailed benchmark tests have been run on MacOS (arm64) and Linux (x86-64).\nWe would expect similar performance on Windows and other Linux flavors.\n\nContributions of benchmark results for other os/architecture combinations are welcome--\nplease open an issue!\n\n### Fast parser\n\nzsv includes a SIMD-accelerated fast parser (`--parser fast`) that uses\nbranchless prefix-XOR carry propagation for quote state tracking, available on\naarch64 (NEON), x86-64 (AVX2), and x86-64 (SSE2), including Windows (mingw64).\nwasm (compiled via emscripten) support will be added next.\n\nThe fast parser is only designed for input that uses quoting as defined in RFC 4180\n(but does not require other limitations of RFC 4180 such as CRLF line ends).\nLike `polars` and `xan`, it does not correctly handle non-standard quoting\nsuch as unescaped quotes in unquoted fields (e.g. `12\" monitor` or `say \"hello\" world`).\nFor such data, use the default compat parser which handles all real-world CSV the same way\nspreadsheet programs do.\n\n## Parallel parsing\nEither the fast or compat parser can be combined with `--parallel` for multi-threaded parsing:\n\n```bash\n# Single-threaded\nzsv count data.csv               # any CSV input\nzsv count --parser fast data.csv # only for CSV input using standard quoting\n\n# Multi-threaded parser (uses all available cores)\nzsv select --parallel data.csv -- 1 2 3               # any CSV input\nzsv select --parser fast --parallel data.csv -- 1 2 3 # only for CSV input using standard quoting\n```\n\n## Which \"CSV\"\n\n\"CSV\" is an ambiguous term. This library uses, *by default*, the same definition\nas Excel (the library and app have various options to change this default\nbehavior); a more accurate description of it would be \"UTF8 delimited data\nparser\" insofar as it requires UTF8 input and its options support customization\nof the delimiter and whether to allow quoting.\n\nIn addition, zsv provides a *row-level* (as well as cell-level) API and provides\n\"normalized\" CSV output (e.g. input of `this\"iscell1,\"thisis,\"cell2` becomes\n`\"this\"\"iscell1\",\"thisis,cell2\"`). Each of these three objectives (Excel\ncompatibility, row-level API and normalized output) has a measurable performance\nimpact; conversely, it is possible to achieve-- which a number of other CSV\nparsers do-- much faster parsing speeds if any of these requirements (especially\nExcel compatibility) are dropped.\n\n### Examples of input that does not comply with RFC 4180\n\nThe following is a list of all input patterns that are\nnon-compliant with RFC 4180, and how zsv (by default) parses each.\nIt is believed to be comprehensive, please log an issue if you think\nit is missing any pattern:\n\n|Input Description|Parser treatment|Example input|How example input is parsed|\n|--|--|--|--|\n|Non-ASCII input, UTF8 BOM| BOM at start of the stream is ignored|(0xEF BB BF)|Ignored|\n|Non-ASCII input, valid UTF8|Parsed as UTF8|你,好|cell1 = 你, cell2 = 好|\n|Non-ASCII input, invalid UTF8|Parsed as UTF8; any non-compliant bytes are retained, or replaced with specified char|aaa,bXb,ccc where Y is malformed UTF8|cell1 = aaa, cell2 = bXb, cell3 = ccc|\n|`\\n`, `\\r`, or `\\r\\n` newlines|Any non-quote-captured occurrence of `\\n`, `\\r`, `\\r\\n` or `\\n\\r` is parsed as a row end|`1a,1b,1c\\n`\u003cbr\u003e`2a,2b,2c\\r`\u003cbr\u003e`3a,3b,3c\\n\\r`\u003cbr\u003e`4a,4b,4c\\r\\n`\u003cbr\u003e`5a,\"5\\nb\",5c\\n`\u003cbr\u003e`6a,\"6b\\r\",\"6c\"\\n`\u003cbr\u003e`7a,7b,7c`|Parsed as 7 rows each with 3 cells|\n|Unquoted quote|Treated like any other non-delmiter|`aaa,b\"bb,ccc`|Cell 2 value is `b\"bb`, output as CSV `\"b\"\"bb\"`|\n|Closing quote followed by character other than delimiter (comma) or row end|Treated like any other non-delmiter|`\"aa\"a,\"bb\"bb\"b,ccc`|Cell 1 value is `aaa`, cell2 value is `bbbb\"b`, output as CSV `aaa` and `\"bbbb\"\"b\"`|\n|Missing final CRLF|Ignored; end-of-stream is considered end-of-row if not preceded by explicit row terminator|`aaa,bbb,ccc\u003cEOF\u003e`|Row with 3 cells, same as if input ended with row terminator preceding `EOF`|\n|Row and header contain different number of columns (cells)|Number of cells in each row is independent of other rows|`aaa,bbb\\n`\u003cbr\u003e`aaa,bbb,ccc`|Row 1 = 2 cells; Row 2 = 3 cells|\n|Header row contains duplicate cells or embedded newlines|Header rows are parsed the same was as other rows (see NOTE below)|`\u003cBOF\u003e\"a\\na\",\"a\\na\"`|Two cells of `a\\na`|\n\nThe above behavior can be altered with various optional flags:\n* Header rows can be treated differently if options are used to skip rows\nand/or use multi-row header span -- see documentation for further detail.\n* Quote support can be turned off, to treat quotes just like any other non-\n  delimiter character\n* Cell delimiter can be a character other than comma\n* Row delimiter can be specfied as CRLF only, in which case a standalone CR\n  or LF is simply part of the cell value, even without quoting\n\n## Built-in and extensible features\n\n`zsv` is an extensible CSV utility, which uses zsvlib, for tasks such as slicing\nand dicing, querying with SQL, combining, serializing, flattening,\n[converting between CSV/JSON/sqlite3](docs/csv_json_sqlite.md) and more.\n\n`zsv` is streamlined for easy development of custom dynamic extensions.\n\nzsvlib and `zsv` are written in C, but since zsvlib is a library, and `zsv`\nextensions are just shared libraries, you can extend `zsv` with your own code in\nany programming language, so long as it has been compiled into a shared library\nthat implements the expected\n[interface](./include/zsv/ext/implementation_private.h).\n\n## Key highlights\n\n- Available as BOTH a library and an application (coming soon: standalone\n  zsvutil library for common helper functions such as csv writer)\n- Open-source, permissively licensed\n- Handles real-world CSV the same way that spreadsheet programs do (*including\n  edge cases*). Gracefully handles (and can \"clean\") real-world data that may be\n  \"dirty\".\n- Runs on macOS (tested on clang/gcc), Linux (gcc), Windows (mingw), BSD\n  (gcc-only) and in-browser (emscripten/wasm)\n- High performance (fastest vs all alternatives we've benchmarked)\n  [app/benchmark/README.md](app/benchmark/README.md)\n- Lightweight: low memory usage (regardless of input data size) and binary size for\n  both lib (~30k) and CLI (\u003c 3MB)\n- Handles general delimited data (e.g. pipe-delimited) and fixed-width input\n  (with specified widths or auto-detected widths), as well as CRLF-only row delims\n  with unquoted embedded LF\n- Handles multi-row headers\n- Handles input from any stream, including caller-defined streams accessed via a\n  single caller-defined `fread`-like function\n- Easy to use as a library in a few lines of code, via either pull or push\n  parsing\n- Includes the `zsv` CLI with the following built-in commands:\n  - [`sheet`](docs/sheet.md), an in-console interactive and extendable grid viewer\n  - `select`, `count`, `sql` query, `desc`ribe, `flatten`, `serialize`, `2json`,\n    `2db`, `stack`, `pretty`, `2tsv`, `paste`, `check`, `compare`, `overwrite`,\n    `jq`\n  - easily [convert between CSV/JSON/sqlite3](docs/csv_json_sqlite.md)\n  - [compare multiple files](docs/compare.md)\n  - [overwrite cells in files](docs/overwrite.md)\n  - [and more](#batteries-included)\n- CLI is easy to extend/customize with a few lines of code via modular plug-in\n  framework. Just write a few custom functions and compile into a distributable\n  DLL that any existing zsv installation can use.\n\n## Why another CSV parser/utility?\n\nOur objectives, which we were unable to find in a pre-existing project, are:\n\n- Reasonably high performance\n- Runs on any platform, including web assembly\n- Available as both a library and a standalone executable / command-line\n  interface utility (CLI)\n- Memory-efficient, configurable resource limits\n- Handles real-world CSV cases the same way that Excel does, including all edge\n  cases (quote handling, newline handling (either `\\n` or `\\r`), embedded\n  newlines, abnormal quoting e.g. aaa\"aaa,bbb...)\n- Handles other \"dirty\" data issues:\n  - Assumes valid UTF8, but does not misbehave if input contains bad UTF8\n  - Option to specify multi-row headers\n  - Does not assume or stop working in case of inconsistent numbers of columns\n- Easy to use library or extend/customize CLI\n\nThere are several excellent tools that achieve high performance. Among those we\nconsidered were xsv and tsv-utils. While they met our performance objective,\nboth were designed primarily as a utility and not a library, and were not easy\nenough, for our needs, to customize and/or to support modular customizations\nthat could be maintained (or licensed) independently of the related project (in\naddition to the fact that they were written in Rust and D, respectively, which\nhappen to be languages with which we lacked deep experience, especially for web\nassembly targeting).\n\nOthers we considered were Miller (`mlr`), `csvkit` and Go (csv module), which\ndid not meet our performance objective. We also considered various other\nlibraries using SIMD for CSV parsing, but none that we tried met the \"real-world\nCSV\" objective.\n\nHence, zsv was created as a library and a versatile application, both optimized\nfor speed and ease of development for extending and/or customizing to your\nneeds.\n\n## Batteries included\n\n`zsv` comes with several built-in commands:\n\n- [`sheet`](docs/sheet.md): an in-console, interactive grid viewer\n- `echo`: read CSV from stdin and write it back out to stdout. This is mostly\n  useful for demonstrating how to use the API and also how to create a plug-in,\n  and has several uses beyond that including adding/removing BOM, cleaning up\n  bad UTF8, whitespace or blank column trimming, limiting output to a contiguous\n  data block, skipping leading garbage, and even proving substitution values\n  without modifying the underlying source\n- `check`: scan for anomolies such as rows with a different number of cells\n  than the header row or invalid utf8\n- `count`: print the number of rows\n- `select`: re-shape CSV by skipping leading garbage, combining header rows into\n  a single header, selecting or excluding specified columns, removing duplicate\n  columns, sampling, converting from fixed-width input, searching and more\n- `desc`: provide a quick description of your table data\n- `sql`: treat one or more CSV files like database tables and query with SQL\n- `pretty`: format for console (fixed-width) display, or convert to markdown\n  format\n- `serialize` (inverse of flatten): convert an NxM table to a single 3x (Nx(M-1))\n  table with columns: Row, Column Name, Column Value\n- `flatten` (inverse of serialize): flatten a table by combining rows that share\n  a common value in a specified identifier column\n- `2json`: convert CSV to JSON. Optionally, output in\n  [database schema](docs/db.schema.json)\n- `2tsv`: convert to TSV (tab-delimited) format\n- `stack`: merge CSV files vertically\n- `paste`: horizontally paste two tables together (given inputs X and Y,\n   output 1...N rows where each row contains the entire corresponding\n   row in X followed by the entire corresponding row in Y)\n- `compare`: compare two or more tables of data and output the differences\n- `overwrite`: overwrite a cell value; changes will be reflected in any zsv\n  command when the --apply-overwrites option is specified\n- `jq`: run a `jq` filter\n- `2db`: [convert from JSON to sqlite3 db](docs/csv_json_sqlite.md)\n- `prop`: view or save parsing options associated with a file, such as initial\n  rows to ignore, or header row span. Saved options are be applied by default\n  when processing that file.\n\nMost of these can also be built as an independent executable named `zsv_xxx`\nwhere `xxx` is the command name.\n\n## Running the CLI\n\nAfter installing, run `zsv help` to see usage details. The typical syntax is\n`zsv \u003ccommand\u003e \u003cparameters\u003e` e.g.:\n\n```shell\nzsv sql my_population_data.csv \"select * from data where population \u003e 100000\"\n```\n\n## Using the API\n\nSimple API usage examples include:\n\n### Pull parsing\n\n```c\nzsv_parser parser = zsv_new(NULL);\nwhile (zsv_next_row(parser) == zsv_status_row) { // for each row\n  // ...\n  const size_t cell_count = zsv_cell_count(parser);\n  for (size_t i = 0; i \u003c cell_count; i++) { // for each cell\n    struct zsv_cell cell = zsv_get_cell(parser, i);\n    printf(\"cell: %.*s\\n\", cell.len, cell.str);\n    // ...\n  }\n}\n```\n\n### Push parsing\n\n```c\nstatic void my_row_handler(void *ctx) {\n  zsv_parser parser = ctx;\n  const size_t cell_count = zsv_cell_count(parser);\n  for (size_t i = 0; i \u003c cell_count; i++) {\n    // ...\n  }\n}\n\nint main() {\n  zsv_parser parser = zsv_new(NULL);\n  zsv_set_row_handler(parser, my_row_handler);\n  zsv_set_context(parser, parser);\n  while (zsv_parse_more(parser) == zsv_status_ok);\n  return 0;\n}\n```\n\nFull application code examples can be found at\n[examples/lib/README.md](examples/lib/README.md).\n\nAn example of using the API, compiled to wasm and called via Javascript, is in\n[examples/js/README.md](examples/js/README.md).\n\nFor more sophisticated (but at this time, only sporadically\ncommented/documented) use cases, see the various CLI C source files in the `app`\ndirectory such as `app/serialize.c`.\n\n## Creating your own extension\n\nYou can extend `zsv` by providing a pre-compiled shared or static library that\ndefines the functions specified in `extension_template.h` and which `zsv` loads\nin one of three ways:\n\n- as a static library that is statically linked at compile time\n- as a dynamic library that is linked at compile time and located in any library\n  search path\n- as a dynamic library that is located in the same folder as the `zsv`\n  executable and loaded at runtime if/as/when the custom mode is invoked\n\n### Example and template\n\nYou can build and run a sample extension by running `make test` from\n`app/ext_example`.\n\nThe easiest way to implement your own extension is to copy and customize the\ntemplate files in [app/ext_template](app/ext_template/README.md)\n\n## Possible enhancements and related developments\n\n- optimize search; add search with hyperscan or re2 regex matching, possibly\n  parallelize?\n- optional OpenMP or other multi-threading for row processing\n- auto-generated documentation, and better documentation in general\n- Additional benchmarking. Would be great to use\n  \u003chttps://bitbucket.org/ewanhiggs/csv-game/src/master/\u003e as a springboard to\n  benchmarking a number of various tasks\n- encoding conversion e.g. UTF16 to UTF8\n\n## Contribute\n\nFeel free to open an issue or discussion.\n\n### Via PR\n\n- [Fork](https://github.com/liquidaty/zsv/fork) the project.\n- Check out the latest [`main`](https://github.com/liquidaty/zsv/tree/main)\n  branch.\n- Create a feature or bugfix branch from `main`.\n- Update your required changes.\n- Make sure to run `clang-format` (version 15 or later) for C source updates.\n- Commit and push your changes.\n- Submit the PR.\n\n### Language bindings\n\nWe currently have community support for Ruby, and we'd love to see a zsv\nwrapper for Python, Rust, Go, or Java or any of your other favorite languages\n\n- Why build a binding? zsv is designed to be embeddable and extremely fast.\n  A binding brings this speed to higher-level languages that often struggle\n  with CSV parsing performance.\n\n## License\n\n[MIT](https://github.com/liquidaty/zsv/blob/master/LICENSE)\n\nThe zsv CLI uses some permissively-licensed third-party libraries.\nSee [misc/THIRDPARTY.md](misc/THIRDPARTY.md) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliquidaty%2Fzsv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliquidaty%2Fzsv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliquidaty%2Fzsv/lists"}