{"id":42060212,"url":"https://github.com/statgen/pheweb","last_synced_at":"2026-01-26T07:38:53.495Z","repository":{"id":9508714,"uuid":"52133265","full_name":"statgen/pheweb","owner":"statgen","description":"A tool to build a website to browse hundreds or thousands of GWAS.","archived":false,"fork":false,"pushed_at":"2025-09-11T16:58:03.000Z","size":11840,"stargazers_count":185,"open_issues_count":41,"forks_count":75,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-09-25T11:32:35.207Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","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/statgen.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.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}},"created_at":"2016-02-20T02:53:21.000Z","updated_at":"2025-09-11T16:58:07.000Z","dependencies_parsed_at":"2024-02-03T20:28:01.606Z","dependency_job_id":"e35be6c5-83c4-4f55-a593-59a3e3e13a1d","html_url":"https://github.com/statgen/pheweb","commit_stats":{"total_commits":1300,"total_committers":11,"mean_commits":"118.18181818181819","dds":"0.10538461538461541","last_synced_commit":"3c37a3826362c26a7bbf311f3768006ae3ae0e4f"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/statgen/pheweb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statgen%2Fpheweb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statgen%2Fpheweb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statgen%2Fpheweb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statgen%2Fpheweb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/statgen","download_url":"https://codeload.github.com/statgen/pheweb/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/statgen%2Fpheweb/sbom","scorecard":{"id":846767,"data":{"date":"2025-08-11","repo":{"name":"github.com/statgen/pheweb","commit":"b646214eae1ba524e239d2f5b20ca011756df770"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.5,"checks":[{"name":"Code-Review","score":1,"reason":"Found 4/22 approved changesets -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/pythonapp.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pythonapp.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/statgen/pheweb/pythonapp.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pythonapp.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/statgen/pheweb/pythonapp.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/pythonapp.yml:17","Warn: pipCommand not pinned by hash: .github/workflows/pythonapp.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/pythonapp.yml:23","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 13 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T21:40:06.460Z","repository_id":9508714,"created_at":"2025-08-23T21:40:06.461Z","updated_at":"2025-08-23T21:40:06.461Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28769853,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T06:37:25.426Z","status":"ssl_error","status_checked_at":"2026-01-26T06:37:23.039Z","response_time":59,"last_error":"SSL_read: 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":[],"created_at":"2026-01-26T07:38:52.208Z","updated_at":"2026-01-26T07:38:53.481Z","avatar_url":"https://github.com/statgen.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"**If you're starting fresh, check out [PheWeb2](https://github.com/GaglianoTaliun-Lab/PheWeb2).  It adds stratification by ancestry/sex, genotype-by-sex interactions, dynamic Miami Plots, a real API, and many other improvements.**\n\n---\n\n\nFor a list of available instances of PheWeb, navigate [here](http://pheweb.sph.umich.edu).\nFor a walk-through demo see [here](etc/demo.md#demo-navigating-pheweb).\nIf you have questions or comments, check out our [Google Group](https://groups.google.com/g/pheweb-umich).\n\n![screenshot of PheWAS plot](https://cloud.githubusercontent.com/assets/862089/25474725/3edbe256-2b02-11e7-8abb-0ca26d406b11.png)\n\n# How to Cite PheWeb\nIf you use the PheWeb code base for your work, please cite our paper:\n\nGagliano Taliun, S.A., VandeHaar, P. et al. Exploring and visualizing large-scale genetic associations by using PheWeb. *Nat Genet* 52, 550–552 (2020).\n\n# How to Build a PheWeb for your Data\n\nIf this is broken, [open an issue on github](https://github.com/statgen/pheweb/issues/new) and hopefully I can help.\n\n### 1. Install PheWeb\n\n```bash\npip3 install pheweb\n```\n\n- If that doesn't work, follow [the detailed install instructions](etc/detailed-install-instructions.md#detailed-install-instructions).\n\n### 2. Create a directory and `config.py` for your new dataset\n\n```\nmkdir ~/my-new-pheweb \u0026\u0026 cd ~/my-new-pheweb\n```\n\nThis directory will store all the files pheweb makes for your dataset. All `pheweb ...` commands should be run in this directory.\n\nMake `config.py` in this directory. In it, either set `hg_build_number = 19` or `hg_build_number = 38`.  Other options you can set are listed [here](etc/detailed-loading-instructions.md#configuration-options).\n\n### 3. Check that your GWAS summary statistics files will work\n\nYou need one file for each phenotype.  Most common GWAS file formats should work.  Here are the requirements:\n\n- It needs a header row.\n- Columns can be delimited by tabs, spaces, or commas.\n- It needs a column for the reference allele (which must always match the bases on the reference genome that you specified with `hg_build_number`) and a column for the alternate allele.  If you have a `MARKER_ID` column like `1:234_C/G`, that's okay too.  If you have an allele1 and allele2, and sometimes one or the other is the reference, then you'll need to modify your files.\n- It can be gzipped if you want.\n- Variants must be sorted by chromosome and position, with chromosomes in the order [1-22,X,Y,MT].\n\nThe file must have columns for:\n\n| column description | name    | other allowed column names | allowed values |\n| ---                | ---     | ---                        | --- |\n| chromosome         | `chrom` | `#chrom`, `chr`            | 1-22, `X`, `Y`, `M`, `MT`, `chr1`, etc |\n| position           | `pos`   | `beg`, `begin`, `bp`       | integer |\n| reference allele   | `ref`   | `reference`                | must match reference genome |\n| alternate allele   | `alt`   | `alternate`                | anything |\n| p-value            | `pval`  | `pvalue`, `p`, `p.value`   | number in [0,1] |\n\n\nYou may also have columns for:\n\n| column description                     | name           | other allowed column names | allowed values |\n| ---                                    | ---            | ---                        | --- |\n| minor allele frequency                 | `maf`          |                            | number in (0,0.5] |\n| allele frequency (of alternate allele) | `af`           | `a1freq`, `frq`            | number in (0,1) |\n| AF among cases                         | `case_af`      | `af.cases`                 | number in (0,1) |\n| AF among controls                      | `control_af`   | `af.controls`              | number in (0,1) |\n| allele count                           | `ac`           |                            | integer |\n| effect size (of alternate allele)      | `beta`         |                            | number |\n| standard error of effect size          | `sebeta`       | `se`                       | number |\n| odds ratio (of alternate allele)       | `or`           |                            | number |\n| R2                                     | `r2`           |                            | number |\n| number of samples                      | `num_samples`  | `ns`, `n`                  | integer, must be the same for every variant in its phenotype |\n| number of controls                     | `num_controls` | `ns.ctrl`, `n_controls`    | integer, must be the same for every variant in its phenotype |\n| number of cases                        | `num_cases`    | `ns.case`, `n_cases`       | integer, must be the same for every variant in its phenotype |\n\n\nColumn names are case-insensitive.  If your file has a different column name, set `field_aliases = {\"column_name\": \"field_name\"}` in `config.py`.  For example, `field_aliases = {'P_BOLT_LMM_INF': 'pval', 'NSAMPLES': 'num_samples'}`.\n\nAny field can be null if it is one of ['', '.', 'NA', 'N/A', 'n/a', 'nan', '-nan', 'NaN', '-NaN', 'null', 'NULL'].  If a required field is null, the variant gets dropped.\n\nIf your pval is log10 (like in REGENIE output), then set these variables in config.py: `pval_is_neglog10 = True` and `field_aliases = {'LOGP':'pval'}`.\n\n### 4. Make a list of your phenotypes\n\nInside of your data directory, you need a file named `pheno-list.json` that looks like this:\n\n```json\n[\n {\n  \"assoc_files\": [\"/home/peter/data/ear-length.gz\"],\n  \"phenocode\": \"ear-length\"\n },\n {\n  \"assoc_files\": [\"/home/peter/data/a1c.X.gz\",\"/home/peter/data/a1c.autosomal.gz\"],\n  \"phenocode\": \"A1C\"\n }\n]\n```\n\nEach phenotype needs `assoc_files` (a list of paths to association files) and `phenocode` (a string representing your phenotype that is used in filenames and URLs, comprised of `[A-Za-z0-9_~-]`).\n\nIf you want, you can also include:\n\n- `phenostring` (string): a name for the phenotype. Shown in tables and tooltips and page headers.\n- `category` (string): groups together phenotypes in the PheWAS plot. Shown in tables and tooltips.\n- `num_cases`, `num_controls`, and/or `num_samples` (number): if your input data only has `AC` or `MAC`, this will be used to calculated `AF` or `MAF`.  Shown in tooltips.  If your input data has correctly-named columns for these, the command `pheweb phenolist read-info-from-association-files` will add them into your existing `pheno-list.json`.\n- anything else you want, but you'll have to modify templates to use it.\n\nYou can use a csv by running:\n\n```\npheweb phenolist import-phenolist \"/path/to/pheno-list.csv\"\n```\n\nor you can make one from scratch by running:\n\n```\npheweb phenolist glob --star-is-phenocode \"/home/peter/data/*.gz\"\n```\n\nYou can see other methods [here](etc/detailed-loading-instructions.md#making-pheno-listjson).\n\n\n### 5. Load your association files\n\nRun `pheweb process`.\n\nTo distribute jobs across a cluster, follow [these instructions](etc/detailed-loading-instructions.md#distributing-jobs-across-a-cluster).\n\nTo include VEP annotations, follow [these instructions](etc/detailed-loading-instructions.md#annotating-with-vep).\n\nIf something breaks and you can't understand the error message or it's something that PheWeb should support by default, [open an issue on github](https://github.com/statgen/pheweb/issues/new) or email me.\n\n### 6. Serve the website\n\nRun `pheweb serve --open`.\n\nThat command should either open a browser to your new PheWeb, or it should give you a URL that you can open in your browser to access your new PheWeb.\nIf it doesn't, follow [the directions for hosting a PheWeb and accessing it from your browser](etc/detailed-webserver-instructions.md#hosting-a-pheweb-and-accessing-it-from-your-browser).\n\n### More options:\n\nTo run pheweb through systemd, see sample file [here](etc/pheweb.service).\nTo use Apache2 or Nginx, see instructions [here](etc/detailed-webserver-instructions.md#using-apache2-or-nginx).\nTo require login via OAuth, see instructions [here](etc/detailed-webserver-instructions.md#using-oauth).\nTo track page views with Google Analytics, see instructions [here](etc/detailed-webserver-instructions.md#using-google-analytics).\nTo reduce storage use, see instructions [here](etc/detailed-webserver-instructions.md#reducing-storage-use).\nTo customize page contents, see instructions [here](etc/detailed-webserver-instructions.md#customizing-page-contents).\n\nPheWeb can display genetic correlations generated by [another tool](https://github.com/statgen/pheweb-rg-pipeline).\nTo use this feature, set `show_correlations = True`  in `config.py` and place the output of the rg pipeline as `pheno-correlations.txt` in the same folder as `pheno-list.json`.\n\nTo hide the button for downloading summary stats, add `download_pheno_sumstats = \"secret\"` and `SECRET_KEY = \"your random string\"` in `config.py`.  That will make a secret page (printed to the console when you start the server) to share summary stats.\nTo hide the button for downloading top hits and phenotypes, add `download_top_hits = \"hide\"` and `download_phenotypes = \"hide\"` respectively.\n\nTo allow dynamically filtering the manhattan plot, run `pheweb best-of-pheno` and set `show_manhattan_filter_button=True` in `config.py`.\n\n# Modifying PheWeb\n\nSee instructions [here](etc/detailed-development-instructions.md).\nSee documentation about the files in `generated-by-pheweb/` [here](etc/detailed-internal-dataflow.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstatgen%2Fpheweb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstatgen%2Fpheweb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstatgen%2Fpheweb/lists"}