{"id":16618613,"url":"https://github.com/brentp/slivar","last_synced_at":"2026-01-26T13:03:24.469Z","repository":{"id":42520525,"uuid":"162162197","full_name":"brentp/slivar","owner":"brentp","description":"genetic variant expressions, annotation, and filtering for great good.","archived":false,"fork":false,"pushed_at":"2025-12-15T17:27:44.000Z","size":3434,"stargazers_count":268,"open_issues_count":47,"forks_count":27,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-12-19T00:11:33.652Z","etag":null,"topics":["genomics","rare-disease","rare-variant-analysis","variant-analysis","variant-interpretation"],"latest_commit_sha":null,"homepage":"","language":"Nim","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/brentp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","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":"2018-12-17T16:50:03.000Z","updated_at":"2025-12-17T23:50:00.000Z","dependencies_parsed_at":"2023-01-28T03:31:06.621Z","dependency_job_id":"4c857b55-bb1a-464b-a2ea-0b5c355a4f96","html_url":"https://github.com/brentp/slivar","commit_stats":null,"previous_names":[],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/brentp/slivar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brentp%2Fslivar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brentp%2Fslivar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brentp%2Fslivar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brentp%2Fslivar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/brentp","download_url":"https://codeload.github.com/brentp/slivar/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/brentp%2Fslivar/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28778738,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T11:46:04.308Z","status":"ssl_error","status_checked_at":"2026-01-26T11:46:02.664Z","response_time":59,"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":["genomics","rare-disease","rare-variant-analysis","variant-analysis","variant-interpretation"],"created_at":"2024-10-12T02:20:50.814Z","updated_at":"2026-01-26T13:03:24.463Z","avatar_url":"https://github.com/brentp.png","language":"Nim","funding_links":[],"categories":[],"sub_categories":[],"readme":"# slivar: filter/annotate variants in VCF/BCF format with simple expressions [![build status](https://github.com/brentp/slivar/actions/workflows/ci.yml/badge.svg)](https://github.com/brentp/slivar/actions/workflows/ci.yml)\n[![downloads](https://anaconda.org/bioconda/slivar/badges/downloads.svg)](https://anaconda.org/bioconda/slivar)\n\n\nIf you use `slivar`, please cite [the paper](https://www.nature.com/articles/s41525-021-00227-3)\n\nslivar is a set of command-line tools that enables rapid querying and filtering of VCF files. \nIt facilitates operations on trios and [groups](#groups) and allows arbitrary expressions using simple javascript.\n\n#### use-cases for `slivar`\n\n+ annotate variants with [gnomad](https://gnomad.broadinstitute.org/) allele frequencies from combined exomes + whole genomes at \u003e 30K variants/second using only a 1.5GB compressed annotation file.\n+ call *denovo* variants with a simple expression that uses *mom*, *dad*, *kid* labels that is applied to each trio in a cohort (as inferred from a pedigree file).\n  `kid.het \u0026\u0026 mom.hom_ref \u0026\u0026 dad.hom_ref \u0026\u0026 kid.DP \u003e 10 \u0026\u0026 mom.DP \u003e 10 \u0026\u0026 dad.DP \u003e 10`\n+ define and filter on arbitrary groups with labels. For example, 7 sets of samples each with 1 normal and 3 tumor time-points:\n  `normal.AD[0] = 0 \u0026\u0026 tumor1.AB  \u003c tumor2.AB \u0026\u0026 tumor2.AB \u003c tumor3.AB`\n+ filter variants with simple expressions:\n  `variant.call_rate \u003e 0.9 \u0026\u0026 variant.FILTER == \"PASS\" \u0026\u0026 INFO.AC \u003c 22 \u0026\u0026 variant.num_hom_alt == 0`\n+ see [using slivar for rare disease research](https://github.com/brentp/slivar/wiki/rare-disease)\n\n![slivar logo](https://user-images.githubusercontent.com/1739/85797163-55738480-b6f8-11ea-8486-389de3e492e6.png)\n\nslivar has sub-commands:\n+ [expr](#expr): filter and/or annotate with INFO, trio, sample, group expressions\n+ [make-gnotate](#make-gnotate): make a compressed zip file of annotations for use by slivar\n+ [compound-hets](#compound-het): true compound hets using phase-by-inheritance within gene annotations\n\n# Table of Contents\n\n* [Installation](#installation)\n* [QuickStart](#quickstart)\n* [Commands](#commands)\n * [expr](#expr)\n    * [trio](#trio)\n    * [Family Expressions](#family-expressions)\n    * [Groups](#groups)\n * [compound-het](#compound-het)\n * [tsv](#tsv)\n * [duo-del](#duo-del)\n * [ddc](#data-driven-cutoffs)\n* [Attributes](#attributes)\n* [How it works](#how-it-works)\n* [Gnotation Files](#gnotation-files)\n\n\n\n## Installation\n\nget the latest binary from: https://github.com/brentp/slivar/releases/latest\n\n`slivar_static` does not depend on any libraries and should work on any 64 bit linux system.        \n\n`slivar_shared` will require libhts.so (from [htslib](https://htslib.org)) to be in the usual places or in a directory indicated in `LD_LIBRARY_PATH`.\n\nor use via docker from: [brentp/slivar:latest](https://hub.docker.com/r/brentp/slivar)\n\n## QuickStart\n\nTo get started quickly, grab a static binary [for the latest release](https://github.com/brentp/slivar/releases/latest) and\nthen follow [this example](https://github.com/brentp/slivar/wiki/rare-disease#full-analysis-for-trios-with-unaffected-parents)\n\nSo for hg38:\n\n```\nvcf=/path/to/your/vcf.vcf.gz\nped=/path/to/your/pedigree.ped\nwget https://github.com/brentp/slivar/releases/download/v0.2.8/slivar\nchmod +x ./slivar\nwget https://raw.githubusercontent.com/brentp/slivar/master/js/slivar-functions.js\nwget https://slivar.s3.amazonaws.com/gnomad.hg38.genomes.v3.fix.zip\n\n# example command\n./slivar expr --js slivar-functions.js -g gnomad.hg38.genomes.v3.fix.zip \\\n\t--vcf $vcf --ped $ped \\\n\t--info \"INFO.gnomad_popmax_af \u003c 0.01 \u0026\u0026 variant.FILTER == 'PASS'\" \\\n\t--trio \"example_denovo:denovo(kid, dad, mom)\" \\\n\t--family-expr \"denovo:fam.every(segregating_denovo)\" \\\n\t--trio \"custom:kid.het \u0026\u0026 mom.het \u0026\u0026 dad.het \u0026\u0026 kid.GQ \u003e 20 \u0026\u0026 mom.GQ \u003e 20 \u0026\u0026 dad.GQ \u003e 20\" \\\n\t--pass-only\n```\n\nThe pedigree format is explained [here](https://github.com/brentp/slivar/wiki/pedigree-file)\n\n## Commands\n\n### expr\n\n`expr` allows filtering on (abstracted) trios and groups. For example, given a VCF (and ped/fam file) with\n100 trios, `slivar` will apply an expression with `kid`, `mom`, `dad` identifiers to each trio that it automatically\nextracts.\n\n`expr` can also be used, for example to annotate with population allele frequencies from a `gnotate` file without\nany sample filtering. See [the wiki](https://github.com/brentp/slivar/wiki/gnotate) for more detail and [the gnotate](#gnotation-files)\nsection for gnotation files that we distribute for `slivar`.\n\n`expr` commands are quite fast, but can be parallelized using [pslivar](https://github.com/brentp/slivar/wiki/parallel-slivar).\n\n#### trio\n\nwhen --trio is used, `slivar` finds all trios in a VCF, PED pair and let's the user specify an expression with indentifiers\nof `kid`, `mom`, `dad` that is applied to each possible trio. For example, a simple expression to call\n*de novo* variants:\n\n```javascript\nvariant.FILTER == 'PASS' \u0026\u0026 \\                         # \nvariant.call_rate \u003e 0.95 \u0026\u0026 \\                         # genotype must be known for most of cohort.\nINFO.gnomad_af \u003c 0.001 \u0026\u0026 \\                           # rare in gnomad (must be in INFO [but see below])\nkid.het \u0026\u0026 mom.hom_ref \u0026\u0026 dad.hom_ref \u0026\u0026 \\            # also unknown\nkid.DP \u003e 7 \u0026\u0026 mom.DP \u003e 7 \u0026\u0026 dad.DP \u003e 7 \u0026\u0026 \\           # sufficient depth in all\n(mom.AD[1] + dad.AD[1]) == 0                          # no evidence for alternate in the parents\n```\n\nThis requires passing variants that are rare in gnomad that have the expected genotypes and do\nnot have any alternate evidence in the parents. If there are 200 trios in the `ped::vcf` given, then this expression\nwill be tested on each of those 200 trios.\n\nWhen trios are not sufficient, use [Family Expressions](#family-expressions) which allow more heterogeneous\nfamily structures.\n\nThe expressions are javascript so the user can make these as complex as needed.\n\n\n```bash\nslivar expr \\\n   --pass-only \\ # output only variants that pass one of the filters (default is to output all variants)\n   --vcf $vcf \\\n   --ped $ped \\\n   # compressed zip that allows fast annotation so that `gnomad_af` is available in the expressions below.\n   --gnotate $gnomad_af.zip \\ \n   # any valid javascript is allowed in a file here. provide functions to be used below.\n   --js js/slivar-functions.js \\ \n   --out-vcf annotated.bcf \\\n   # this filter is applied before the trio filters and can speed evaluation if it is stringent.\n   --info \"variant.call_rate \u003e 0.9\" \\ \n   --trio \"denovo:kid.het \u0026\u0026 mom.hom_ref \u0026\u0026 dad.hom_ref \\\n                   \u0026\u0026 kid.AB \u003e 0.25 \u0026\u0026 kid.AB \u003c 0.75 \\\n                   \u0026\u0026 (mom.AD[1] + dad.AD[1]) == 0 \\\n                   \u0026\u0026 kid.GQ \u003e= 20 \u0026\u0026 mom.GQ \u003e= 20 \u0026\u0026 dad.GQ \u003e= 20 \\\n                   \u0026\u0026 kid.DP \u003e= 12 \u0026\u0026 mom.DP \u003e= 12 \u0026\u0026 dad.DP \u003e= 12\" \\\n   --trio \"informative:kid.GQ \u003e 20 \u0026\u0026 dad.GQ \u003e 20 \u0026\u0026 mom.GQ \u003e 20 \u0026\u0026 kid.alts == 1 \u0026\u0026 \\\n           ((mom.alts == 1 \u0026\u0026 dad.alts == 0) || (mom.alts == 0 \u0026\u0026 dad.alts == 1))\" \\\n   --trio \"recessive:trio_autosomal_recessive(kid, mom, dad)\"\n\n```\n\nNote that `slivar` does not give direct access to the genotypes, instead exposing \n`hom_ref`, `het`, `hom_alt` and `unknown` or via `alts` where 0 is homozygous reference, 1 is heterozygous, 2 is\nhomozygous alternate and -1 when the genotype is unknown. It is recommended to **decompose** a VCF before sending to `slivar`\n\nHere it is assumed that `trio_autosomal_recessive` is defined in `slivar-functions.js`; an example implementation of that\nand other useful functions is provided [here](https://github.com/brentp/slivar/blob/4856c503a15f2647270a2ac24e4e1b1455208e34/js/slivar-functions.js).\nNote that it's often better to use --family-expr instead as it's more flexible than trio expressions.\n\n\n#### Family Expressions\n\nTrios are a nice abstraction for cohorts consisting of only trios, but for more general uses, there is `--family-expr`\nfor example, given either a duo, or a quartet, we can find variants present only in affected samples with:\n\n```\t\t\n --family-expr \"aff_only:fam.every(function(s) { return s.het == s.affected \u0026\u0026 s.hom_ref == !s.affected \u0026\u0026 s.GQ \u003e 5 })\"\n```\n\nNote that this does not explicitly check for transmission or non-transmission between parents and off-spring\nso it is less transparent than the `trio` mode, but more flexible.\n\n\n#### Groups\n\nA `trio` is a special-case of a `group` that can be inferred from a pedigree. For more specialized use-cases, a `group` can be\nspecified. For example we could, instead of  using `--trio`, use a `group` file like:\n```\n#kid\tmom\tdad\nsample1\tsample2\tsample3\nsample4\tsample5\tsample6\nsample7\tsample8\tsample9\n```\n\nWhere, here we have specified 3 trios below a header with their \"labels\". This can be accomplished using `--trio`, but we can\nfor example specify quartets like this:\n\n```\n#kid\tmom\tdad\tsibling\nsample1\tsample2\tsample3\tsample10\nsample4\tsample5\tsample6\tsample11\nsample7\tsample8\tsample9\tsample12\n```\n\nwhere `sample10` will be available as \"sibling\" in the first family and an expression like:\n```bash\nkid.alts == 1 \u0026\u0026 mom.alts == 0 \u0026\u0026 dad.alts == 0 and sibling.alts == 0\n```\ncould be specified and it would automatically be applied to each of the 3 families.\n\nAnother example could be looking at somatic variants with 3 samples, each with a normal and 4 time-points of a tumor:\n```\n#normal\ttumor1\ttumor2\ttumor3\ttumor4\nss1\tss8\tss9\tss10\tss11\nss2\tss12\tss13\tss14\tss15\t\nss3\tss16\tss17\tss18\tss19\t\n```\n\nwhere, again each row is a sample and the ID's (starting with \"ss\") will be injected for each sample to allow a single\nexpression like:\n```bash\nnormal.hom_ref \u0026\u0026 normal.DP \u003e 10 \\\n  \u0026\u0026 tumor1.AB \u003e 0 \\\n  \u0026\u0026 tumor1.AB \u003c tumor2.AB \\\n  \u0026\u0026 tumor2.AB \u003c tumor3.AB \\\n  \u0026\u0026 tumor3.AB \u003c tumor4.AB\n```\n\nto find a somatic variant that has increasing frequency (AB is allele balance) along the tumor time-points.\nMore detail on groups is provided [here](https://github.com/brentp/slivar/wiki/groups-in-slivar)\n\n#### Sample Expressions\n\nUsers can specify a boolean expression that is tested against each `sample` using e.g.:\n\n```\n--sample-expr \"hi_quality:sample.DP \u0026\u0026 sample.GQ \u003e 10\"\n```\n\nEach sample that passes this expression will be have its sample id appended to the INFO field of `hi_quality` which\nis added to the output VCF.\n\n\n#### make-gnotate\n\nUsers can make their own `gnotate` files like:\n\n```bash\nslivar make-gnotate --prefix gnomad \\\n    --field AF_popmax:gnomad_popmax_af \\\n    --field nhomalt:gnomad_num_homalt \\\n    gnomad.exomes.r2.1.sites.vcf.gz gnomad.genomes.r2.1.sites.vcf.gz\n```\n\nthis will pull `AF_popmax` and `nhomalt` from the INFO field and put them into `gnomad.zip` as `gnomad_popmax_af` and `gnomad_num_homalt` respectively.\nThe resulting zip file will contain the union of values seen in the exome and genomes files with the maximum value for any intersection.\nNote that the names (`gnomad_popmax_af` and `gnomad_num_homalt` in this case) should be chosen carefully as those will be the names added to the INFO of any file to be annotated with the resulting `gnomad.zip`\n\nMore information on `make-gnotate` is [in the wiki](https://github.com/brentp/slivar/wiki/make-gnotate)\n\n### compound-het\n\nThis command is used to find compound heterozygous variants (with phasing-by-inheritance) in trios.\nIt is used after filtering to rare(-ish) heterozygotes.\n\nSee a full description of use [here](https://github.com/brentp/slivar/wiki/compound-heterozygotes)\n\n**NOTE** that by default, this command limits to a subset of impacts; this is\nadjustable with the `--skip` flag. See more on the\n[wiki](https://github.com/brentp/slivar/wiki/compound-heterozygotes)\n\n### tsv\n\nThis command is used to convert a filtered and annotated VCF to a TSV (tab-separated value file) for final \nexamination. An example use is:\n\n```\nslivar tsv -p $ped \\\n    -s denovo -s x_recessive \\\n    -c CSQ \\\n    -i gnomad_popmax_af -i gnomad_nhomalt \\\n    -g gene_desc.txt -g clinvar_gene_desc.txt \\\n    $vcf \u003e final.tsv\n```\n\nwhere `denovo` and `x_recessive` indicate the INFO fields that contain lists of samples (as added by slivar) that should be extracted.\nand `gnomad_popmax_af` and `gnomad_nhomalt` are pulled from the INFO field. \nThe `-c` arugment (CSQ) tells `slivar` that it can get gene, transcript and impact information from the CSQ field in the INFO.\nAnd the `-g` arguments are tab-delimited files of gene -\u003e description where the description is added to the text output for quick inspection.\nRun `slivar tsv` without any arguments for examples on how to create these for pLI and clinvar.\n\nAlso see the [wiki](https://github.com/brentp/slivar/wiki/tsv:-creating-a-spreadsheet-from-a-filtered-VCF)\n\n## duo-del\n\nslivar duo-del finds structural deletions in parent-child duos using non-transmission of alleles. this \ncan work to find deletions in exome data using genotypes, thereby avoiding the problems associated with\ndepth-based CNV calling in exomes.\n\nsee: https://github.com/brentp/slivar/wiki/finding-deletions-in-parent-child-duos\n\n## Data Driven Cutoffs\n\n`slivar ddc` is a tool to discover data-driven cutoffs from a VCF and pedigree information.\nIt generates an interative VCF so a user can see how **mendelian violation and transmissions**\nare effected by varying cutoffs for values in the INFO and FORMAT fields.\n\nSee [the wiki](https://github.com/brentp/slivar/wiki/data-driven-cutoffs) for more details.\n\n## Attributes\n\n + anything in the INFO is available as e.g. INFO.DP\n + INFO.impactful which, if CSQ (VEP), BCSQ (bcftools), or ANN (snpEff) is present indicates if the highest impact is \"impactful\". see [wiki](https://github.com/brentp/slivar/wiki/impactful) and `INFO.genic` which includes other gene impacts like `synonymous`. Also `INFO.highest_impact_order` explained in the wiki\n + variant consequences such as in INFO.CSQ can be parsed and used as object as described [here](https://github.com/brentp/slivar/wiki/CSQ)\n + if FORMAT.AB is not present, it is added so one can filter with kid.AB \u003e 0.25 \u0026\u0026 kid.AB \u003c 0.75\n + variant attributes are: `CHROM`, `POS`, `start`, `end`, `ID`, `REF`, `ALT`, `QUAL`, `FILTER`,\n                           `is_multiallelic`\n + calculated variant attributes include: `aaf`, `hwe_score`, `call_rate`, `num_hom_ref`, `num_het`, `num_hom_alt`, `num_unknown`\n\n + numeric and flag sample attributes (via `kid`, `mom`, `dad`) included in the FORMAT. available as e.g. `kid.AD[1]`, `mom.DP`, etc.\n + if the environment variable `SLIVAR_FORMAT_STRINGS` is not empty, then string sample fields will be available. these are not populated\n   by default as they are used less often and impact performance.\n + sample attributes for `hom_ref`, `het`, `hom_alt`, `unknown` which are synonums for `sample.alts` of 0, 1, 2, -1 respectively.\n + sample attributes from the ped for `affected`, `phenotype`, `sex`, `id` are available as, e.g. kid.sex.\n   phenotype is a string taken directly from the pedigree file while affected is a boolean.\n + sample relations are available as `mom`, `dad`, `kids`. `mom` and `dad` will be undefined if not available and kids will be an empty array.\n + a `VCF` object contains `CSQ`, `BCSQ`, `ANN` if those are present in the header (from VEP, BCFTOOLS, SnpEFF). The content is a list indicating\n   the order of entries in the field e.g. `[\"CONSEQUENCE\", \"CODONS\",\"AMINO_ACIDS\", \"GENE\", ...]`\n\n## How it works\n\n `slivar` embeds the [duktape javascript engine](https://duktape.org/) to allow the user to specify expressions.\n For each variant, each trio (and each sample), it fills the appropriate `attributes`. This can be intensive for\n VCFs with many samples, but this is done **as efficiently as possible** such that `slivar` can evaluate 10's of\n thousand of variants per second even with dozens of trios.\n\n## Summary Table\n\nslivar outputs a summary table with rows of samples and columns of expression where each value\nindicates the number of variants that passed the expression in each sample. By default, this goes to STDOUT\nbut if the environment variable `SLIVAR_SUMMARY_FILE` is set, `slivar` will write the summary to that file\ninstead.\n\n## Gnotation Files\n\nUsers can create their own gnotation files with `slivar make-gnotate`, but we provide:\n\n+ gnomad for hg37 with AF popmax, numhomalts (total and controls only) [here](https://s3.amazonaws.com/slivar/gnomad.hg37.zip)\n+ gnomad for hg38 (v3) genomes [here](https://slivar.s3.amazonaws.com/gnomad.hg38.genomes.v3.fix.zip)\n\n\n+ **lifted** gnomad exomes+genomes for hg38 with AF popmax, numhomalts (updated in release v0.1.2) [here](https://s3.amazonaws.com/slivar/gnomad.hg38.v2.zip)\n\u003c!--\n+ gnomad genomes (71,702 samples) for hg38 with AF popmax, numhomalts (updated in release v0.1.7) [here](https://slivar.s3.amazonaws.com/gnomad.hg38.genomes.v3.zip)\n--\u003e\n+ spliceai scores (maximum value of the 4 scores in spliceai) [here](https://s3.amazonaws.com/slivar/spliceai.hg37.zip)\n\n+ [topmed allele frequencies (via dbsnp)](https://slivar.s3.amazonaws.com/topmed.hg38.dbsnp.151.zip) these can be used with `INFO.topmed_af`. Useful when analyzing data in hg38 because [some variants in hg38 are not visible in GRCh37](https://twitter.com/brent_p/status/1139540523364917248)\n\nThe available fields can be seen with, for example:\n\n```\n$ unzip -l gnomad.hg38.v2.zip | grep -oP \"gnotate-[^.]+\" | sort -u\ngnotate-gnomad_nhomalt\ngnotate-gnomad_nhomalt_controls\ngnotate-gnomad_popmax_af\ngnotate-gnomad_popmax_af_controls\ngnotate-variant\n```\n\nindicating that `INFO.gnomad_nhomalt`, `INFO.gnomad_nhomalt_controls`, `INFO.gnomad_popmax_af` and `INFO.gnomad_popmax_af_controls` will be\nthe fields after they are added to the INFO.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrentp%2Fslivar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbrentp%2Fslivar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbrentp%2Fslivar/lists"}