{"id":13703849,"url":"https://github.com/incertae-sedis/smof","last_synced_at":"2025-12-17T09:22:39.397Z","repository":{"id":16451829,"uuid":"19203682","full_name":"incertae-sedis/smof","owner":"incertae-sedis","description":"Explore and analyze biological sequence data","archived":false,"fork":false,"pushed_at":"2024-08-01T03:49:19.000Z","size":6133,"stargazers_count":17,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-21T05:56:51.460Z","etag":null,"topics":["bioinformatics","biology","fasta","genomics","sequence","sequence-analysis"],"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/incertae-sedis.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,"publiccode":null,"codemeta":null}},"created_at":"2014-04-27T12:34:29.000Z","updated_at":"2025-10-14T15:52:04.000Z","dependencies_parsed_at":"2024-11-13T10:41:49.284Z","dependency_job_id":null,"html_url":"https://github.com/incertae-sedis/smof","commit_stats":{"total_commits":468,"total_committers":10,"mean_commits":46.8,"dds":0.06623931623931623,"last_synced_commit":"b2b28dc74a7a8e46a2526724c5044ef630b26465"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/incertae-sedis/smof","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/incertae-sedis%2Fsmof","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/incertae-sedis%2Fsmof/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/incertae-sedis%2Fsmof/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/incertae-sedis%2Fsmof/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/incertae-sedis","download_url":"https://codeload.github.com/incertae-sedis/smof/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/incertae-sedis%2Fsmof/sbom","scorecard":{"id":486936,"data":{"date":"2025-08-11","repo":{"name":"github.com/incertae-sedis/smof","commit":"d84608b6071538bd017cd4e2dfee71d6dc1a3e91"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"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":"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":"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":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","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":"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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":"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":"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating alpine:3.8 to alpine:3.8@sha256:2bb501e6173d9d006e56de5bce2720eb06396803300fe1687b58a7ff32bf4c14","Warn: pipCommand not pinned by hash: Dockerfile:11","Info:   0 out of   1 pipCommand dependencies pinned","Info:   0 out of   1 containerImage 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":"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 2 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-19T18:02:56.278Z","repository_id":16451829,"created_at":"2025-08-19T18:02:56.278Z","updated_at":"2025-08-19T18:02:56.278Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280213279,"owners_count":26291739,"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":["bioinformatics","biology","fasta","genomics","sequence","sequence-analysis"],"created_at":"2024-08-02T21:01:00.779Z","updated_at":"2025-10-21T05:56:56.104Z","avatar_url":"https://github.com/incertae-sedis.png","language":"Python","funding_links":[],"categories":["Next Generation Sequencing"],"sub_categories":["Sequence Processing"],"readme":"[![stable](http://badges.github.io/stability-badges/dist/stable.svg)](http://github.com/badges/stability-badges)\n[![Build Status](https://travis-ci.org/incertae-sedis/smof.svg?branch=master)](https://travis-ci.org/incertae-sedis/smof)\n[![Docker Docker build](https://img.shields.io/docker/cloud/build/incertaesedis/smof.svg)](https://hub.docker.com/r/incertaesedis/smof/) [![docker pulls](https://img.shields.io/docker/pulls/incertaesedis/smof.svg)](https://hub.docker.com/r/incertaesedis/smof/)\n![PyPI](https://img.shields.io/pypi/v/smof.svg)\n[![DOI](https://zenodo.org/badge/19203682.svg)](https://zenodo.org/badge/latestdoi/19203682)\n\nsmof - Simple Manipulation Of FASTA\n====\n\nUNIX-style FASTA tools\n\nInstallation\n============\n\n```\npip install smof\n```\n\nFunctions\n=========\n\n`smof` is divided into the following subcommands:\n\n | subcommand  | description                                           |\n | ----------  | ----------------------------------------------------- |\n | `cut`       | emulates UNIX cut command, where fields are entries   |\n | `clean`     | cleans fasta files                                    |\n | `consensus` | finds the consensus sequence for aligned sequence     |\n | `filter`    | extracts sequences meeting the given conditions       |\n | `grep`      | roughly emulates the UNIX grep command                |\n | `md5sum`    | calculate an md5 checksum for the input sequences     |\n | `head`      | writes the first sequences in a file                  |\n | `permute`   | randomly order sequence                               |\n | `reverse`   | reverse each sequence (or reverse complement)         |\n | `sample`    | randomly select entries from fasta file               |\n | `sniff`     | extract info about the sequence                       |\n | `sort`      | sort sequences                                        |\n | `split`     | split a fasta file into smaller files                 |\n | `stat`      | calculate sequence statistics                         |\n | `subseq`    | extract subsequence from each entry (revcomp if a\\\u003cb) |\n | `tail`      | writes the last sequences in a file                   |\n | `translate` | translate a DNA sequence into a protein sequence      |\n | `uniq`      | count, omit, or merge repeated entries                |\n | `wc`        | roughly emulates the UNIX wc command                  |\n\n\nDetailed instructions on how to use each command in `smof` is available via the\n'-h' option.\n\nTo list subcommands\n\n``` bash\nsmof -h\n```\n\nGet help on a specific subcommand\n\n``` bash\nsmof grep -h\n```\n\nSample data\n===========\n\nThe FASTA files used in the examples below are available in the\n`sample-data/anncaliia_algerae` folder in the `smof` github repo\n([here](https://github.com/incertae-sedis/smof)).\n\nUNIX-like commands\n==================\n\nThis group of subcommands include commands based off UNIX builtins.\n\n## `smof head` and `tail`\n\nThese functions mimic their GNU counterparts but on the entry, rather than\nline, level. For example `smof head` prints the first entry in a file and `smof\n-5` prints the first 5. Similarly for `smof tail`. \n\n```bash\nsmof head aa.faa\nsmof head -3 aa.faa\nsmof tail aa.faa\nsmof tail -3 aa.faa\nsmof tail +2 aa.faa | smof head\n```\n\nIn addition to the GNU-like functionallity, `smof head` and `tail` can also\nlimit the sequence that is output. This can be useful for diagnostic purposes.\n\n```bash\n# print last 3 nucleotides (last codon) from the first 5 transcripts\nsmof head -l 3 -5 aa.transcripts.fna\n# print the first codon\nsmof head -f 3 -5 aa.transcripts.fna\n# print first and last\nsmof head -f 3 -l 3 -5 aa.transcripts.fna\n```\n\nThis sort of diagnostics is easier done with `smof sniff`.\n\n## `smof sort`\n\n`smof sort` can be used to simply sort sequences alphabetically by header. It\ncan also sort by sequence length. One useful feature with no homolog in GNU\nsort is the ability to sort by regex capture. For example, if the FASTA headers\nare formated like 'locus|xxx|taxon|yyy|gi|zzz', you can sort them numerically\nby taxon with the command `smof sort -nx 'taxon\\|(\\d+)'`.\n\n```bash\n# print the shortest sequence\nsmof sort -l aa.faa | smof head\n# print the longest sequence\nsmof sort -l aa.faa | smof tail\n# sort by the function in the header description\nsmof sort -x 'PRA339 (.*)' aa.faa | smof tail\n```\n\n## `smof sample`\n\n`smof sample` allows extraction of a random sample of entries. With no\narguments, it reads the entire file into memory and outputs a random one.\n\n```bash\n# retrieve 1 sequence by default\nsmof sample aa.faa\nsmof sample -n 5 aa.faa\n# set a random seed (useful for debugging and reproducible scripts)\nsmof sample --seed 42 aa.faa\n```\n\n## `smof split`\n\nThis command allows easily splitting of a large file into many smaller files.\n\nYou can split a large file several small files with equal numbers of sequences\n```bash\nsmof split -n 5 -p zzz aa.faa\ngrep -c '\u003e' aa.faa zzz*\nrm zzz*\n```\n\nOf you can split a large file into many smaller files with a set maximum number\nof sequences per file\n```bash\nsmof split -qn 500 -p zzz aa.faa\ngrep -c '\u003e' aa.faa zzz*\nrm zzz*\n```\n\n## `smof uniq`\n\nThis command corresponds roughly to GNU uniq, but entries are considered\nidentical only if both header and sequence are exactly the same. As currently\nimplemented, I don't find much use for this command.\n\n## `smof wc`\n\nOutputs the number of characters and entries in the fasta file. Generally `smof\nstat` is better.\n\n## `smof grep`\n\nWhereas GNU grep searches lines for matches, `smof grep` searches either the\nFASTA headers or the FASTA sequence.\n\nExtract the entries by matches to the header (default)\n\n``` bash\nsmof grep H312_03353 aa.faa\n```\n\nExtract entries by matches to a sequence \n\n```bash\nsmof grep --match-sequence SKSQ aa.faa\n# or equivalently\nsmof grep -q SKSQ aa.faa\n```\n\nYou can include flanking regions in the match\n```bash\n# match 3 residues downstream\nsmof grep -qA3 'SKSQ' aa.faa\n# match 3 residues upstream \nsmof grep -qB3 'SKSQ' aa.faa\n# match 3 residues up- and downstream \nsmof grep -qC3 'SKSQ' aa.faa\n```\n\nInclusion of flanking regions is particularly useful in tandem with the -o\noption, which extracts only the matching sequence\n```bash\nsmof grep -qoA3 'SKSQ' aa.faa\n```\n\nWrite the output in gff format\n```bash\nsmof grep -q --gff SKSQ aa.faa\n```\n\nYou can count the number of sequences with a match\n```bash\nsmof grep -qc SKS aa.faa\n```\n\nOr the total number of matches\n```bash\nsmof grep -qm SKSQ aa.faa\n```\n\nOr both\n```bash\nsmof grep -qmc SKS aa.faa\n```\n\nJust like in GNU grep, you can invert a search. This search finds all genes\nthat are not annotated as being hypothetical genes.\n```bash\nsmof grep -v hypothetical aa.faa\n```\n\nBy default `smof grep` is case insensitive (unlike GNU grep), but it can be\nmade case sensitive\n```bash\nsmof grep -I CoA aa.faa\n```\n\nYou can search using patterns in a file\n```bash\nsmof grep -f id-sample.txt aa.faa\n```\n\nThis, however, can be a little slow, since it searchs each pattern in the file\nagainst the entire header. A much faster approach is to extract a search\npattern from the headers (or sequence) and then lookup the header pattern in\nthe set of search patterns.\n\n```bash\nsmof grep -f id-sample.txt -w '\\| (\\S+) \\|' aa.faa\n```\n\nCount occurrences (on both strands) of a DNA pattern using IUPAC extended\nnucleotide alphabet.\n```bash\nsmof grep -qmbG YYNCTATAWAWASM aa.supercontigs.fna\n```\n\nYou can search using a sequence query\n```bash\n# select 5 random sequences\nsmof sample -n 5 aa.faa | smof subseq -b 5 35 \u003e rand.faa\nsmof grep -q --fastain rand.faa aa.faa\n```\n\nOr you can search for identical sequences shared between two fasta files\n```bash\nsmof sample -n 5 aa.faa \u003e rand.faa\nsmof grep -q --fastain rand.faa aa.faa \n```\n\nFind non-overlapping open reading frames of length greater than 100 codons.\nThis is meant as an example of regex searching. This will NOT give you a great\nanswer. smof does not consider frames (nor will it ever). It will not find the\nset of longest possible ORFs. If you want to identify ORFs, you should use a\nspecialized program. That said:\n\n``` bash\nsmof grep -qPb --gff 'ATG(.{3}){99,}?(TAA|TGA|TAG)' aa.supercontigs.fna\n```\n\n## `smof md5sum`\n\nThis tool is useful if you want a checksum for a FASTA file that is independent\nof format (e.g. column width or case).\n\n\nString manipulation commands\n============================\n\n## `smof permute`\n\nPermutes the letters of a sequence\n\n## `smof reverse`\n\nReverses a sequence (does NOT take the reverse complement)\n\n## `smof subseq`\n\n``` bash\n# extract a subsequence\nsmof grep H312_00003T0 aa.faa | smof subseq -b 10 20\n# color the subsequences instead\nsmof grep H312_00003T0 aa.faa | smof subseq -b 10 20 -c red\n```\n\nIf the start is higher than the end, and the sequence appears to be a DNA\nsequence, then smof will take the reverse complement.\n\n`smof subseq` can also read from a gff file. However, if you want to extract\nmany sequences from a fasta file using a gff file as a guide (or other gff/bed\nmanipulations), consider using a specialized tools such as `bedtools`.\n\n\nBiological sequence tools\n=========================\n\n## `smof clean`\n\nThis command can be used to tidy a sequence. You can change the column width,\nremove gaps and stops, convert all letters to one case and/or change irregular\ncharacters to unknowns. By default, it removes whitespace in a sequence and\nmakes uniform, 80-character columns.\n\n## `smof filter`\n\nOutput only sequence that meet a set of conditions.\n\nIf you want to only keep sequences that are longer than 100 letters\n\n```bash\nsmof clean -x aa.faa | smof filter -l 100\n```\n\nNote that I call clean before filtering to remove the stop character, which\nshould not be included when calculating length.\n\nOr shorter than 100 letters\n\n```bash\nsmof clean -x aa.faa | smof filter -s 100 aa.faa\n```\n\nOr that have greater than 50% AFILMVW content (hydrophobic amino acids)\n\n```bash\nsmof clean -x aa.faa | smof filter -c 'AFILMVW \u003e .5' aa.faa\n```\n\n## `smof sniff`\n\nThis command runs a number of checks on a FASTA file and is useful in\ndiagnosing problems. For details, run `smof sniff -h`.\n\n## `smof stat`\n\nThe default operation outputs number of sequences and summary statistics\nconcerning the sequence lengths.\n\n```bash\nsmof stat aa.supercontigs.fna\n nseq:      431\n nchars:    12163397\n 5sum:      445 3301 9555 30563 746881\n mean(sd):  28221 (58445)\n N50:       71704\n```\n\n'5sum' refers to the five number summary of the sequence lengths (minimum, 25%\nquantile, median, 75% quantile, and maximum).\n\nStatistics can also be calculated on a sequence-by-sequence level, which by\ndefault outputs the sequence names (the first word of the header) and the\nsequence length, e.g.\n\n```bash\nsmof stat -q aa.supercontigs.fna | head\n```\n\nThere are many other options. Run `smof stat -h` for descriptions.\n\n\nCase study: exploring motifs in chloroplast genomes\n===================================================\n\nAlice is interested in the chloroplast *maturase* gene. Bob gives her a sample\ndataset which includes 10 fasta files of proteins encoded by the chloroplast\ngenomes of 10 different plant species. These files are available in the\n`sample-data/chloroplasts` directory.\n\nYou can find this dataset in the folder *doc/test-data/chloroplast-proteins*.\n\nHer first step is to explore the data. She first counts the sequences in each\nfile with a simple grep command.\n\n```\ngrep -c '\u003e' *faa\n```\n\nNext she tests the sequences with `smof sniff`\n\n```\nsmof sniff *faa\n```\n\nProducing the following output:\n\n```\n578 uniq sequences (757 total)\nAll prot\nAll uppercase\nProtein Features:\n  initial-Met:         755        99.7358%\n  terminal-stop:       0          0.0000%\n  internal-stop:       0          0.0000%\n  selenocysteine:      0          0.0000%\nUniversal Features:\n  unknown:             8          1.0568%\n  ambiguous:           0          0.0000%\n  gapped:              0          0.0000%\n```\n\nEverything looks pretty good. But two of the sequences don't start with a\nmethionine. Alice wants to find them. She does this using `smof grep` and a\nPerl regular expressions.\n\n```\nsmof grep -qP '^[^M]' *faa\n```\n\nShe finds these genes are both from *Solanum lycopersicum* and are described in\nthe fasta headers as being *partial*.\n\nNow Alice wants to find the *maturase* genes by pulling out every entry with\n'maturase' in the fasta header.\n\n```\nsmof grep maturase *faa\nsmof grep maturase *faa \u003e maturase.faa\n```\n\nFor a close look at the distribution of sequence lengths, Alice calls `smof\nstat`\n\n```\nsmof stat maturase.faa\n```\n\nAlice happens to be interested in the sequence WTQPQR from *Panicum virgatum*\nand would like to know what the homologous regions are in the other species.\n\nSo Alice aligns the maturase genes with\n[MUSCLE](http://nar.oxfordjournals.org/content/32/5/1792.short) and searches\nfor the motif using the GFF output option.\n\n```\nmuscle -quiet \u003c maturase.faa | tee maturase.aln | smof grep -q --gff WTQPQR\n```\n\nThis is outputs the location of the match in standard GFF format, i.e. the\nmatch is at position 329 to 334. Homologs to this sequence will be at the same\npositions in the aligned fasta file output by MUSCLE.\n\n```\nsmof subseq -b 329 334 maturase.aln\n```\n\nHMMER could then be used to analyze the by-site conservation of the sextuplet.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fincertae-sedis%2Fsmof","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fincertae-sedis%2Fsmof","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fincertae-sedis%2Fsmof/lists"}