{"id":19798607,"url":"https://github.com/eriknyquist/bfi","last_synced_at":"2026-02-12T20:33:04.075Z","repository":{"id":57414824,"uuid":"91935827","full_name":"eriknyquist/bfi","owner":"eriknyquist","description":"Fast optimizing Brainfuck interpreter in pure python","archived":false,"fork":false,"pushed_at":"2025-11-08T18:01:47.000Z","size":217,"stargazers_count":14,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-01-03T08:59:14.599Z","etag":null,"topics":["brainfuck","brainfuck-interpreter","brainfuck-language","esoteric-interpreter","esoteric-language","esoteric-languages","esoteric-programming-language","pure-python","python"],"latest_commit_sha":null,"homepage":"https://bfi.readthedocs.io/en/latest","language":"Brainfuck","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/eriknyquist.png","metadata":{"files":{"readme":"README.rst","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}},"created_at":"2017-05-21T05:42:46.000Z","updated_at":"2025-11-09T22:21:15.000Z","dependencies_parsed_at":"2022-08-30T05:40:50.735Z","dependency_job_id":null,"html_url":"https://github.com/eriknyquist/bfi","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/eriknyquist/bfi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Fbfi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Fbfi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Fbfi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Fbfi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eriknyquist","download_url":"https://codeload.github.com/eriknyquist/bfi/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Fbfi/sbom","scorecard":{"id":381071,"data":{"date":"2025-08-11","repo":{"name":"github.com/eriknyquist/bfi","commit":"7f0f8c6451f7afb3d1b7d02a597f7ae17f5f85d9"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"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":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"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":"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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":-1,"reason":"no dependencies found","details":null,"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: 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":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.0.4 not signed: https://api.github.com/repos/eriknyquist/bfi/releases/68675857","Warn: release artifact v1.0.3 not signed: https://api.github.com/repos/eriknyquist/bfi/releases/68674309","Warn: release artifact v1.0.2 not signed: https://api.github.com/repos/eriknyquist/bfi/releases/66295508","Warn: release artifact v1.0.4 does not have provenance: https://api.github.com/repos/eriknyquist/bfi/releases/68675857","Warn: release artifact v1.0.3 does not have provenance: https://api.github.com/repos/eriknyquist/bfi/releases/68674309","Warn: release artifact v1.0.2 does not have provenance: https://api.github.com/repos/eriknyquist/bfi/releases/66295508"],"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"}}]},"last_synced_at":"2025-08-18T15:28:32.994Z","repository_id":57414824,"created_at":"2025-08-18T15:28:32.994Z","updated_at":"2025-08-18T15:28:32.994Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29380604,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T19:05:20.189Z","status":"ssl_error","status_checked_at":"2026-02-12T19:01:44.216Z","response_time":55,"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":["brainfuck","brainfuck-interpreter","brainfuck-language","esoteric-interpreter","esoteric-language","esoteric-languages","esoteric-programming-language","pure-python","python"],"created_at":"2024-11-12T07:30:45.274Z","updated_at":"2026-02-12T20:33:04.068Z","avatar_url":"https://github.com/eriknyquist.png","language":"Brainfuck","readme":".. |brain| unicode:: 0x1F9E0\n\nFast Brainfuck interpreter in pure python |brain|\n=================================================\n\n.. |tests_badge| image:: https://github.com/eriknyquist/bfi/actions/workflows/tests.yml/badge.svg\n.. |version_badge| image:: https://badgen.net/pypi/v/bfi\n.. |license_badge| image:: https://badgen.net/pypi/license/bfi\n.. |downloads_badge| image:: https://static.pepy.tech/badge/bfi\n\n|tests_badge| |version_badge| |license_badge| |downloads_badge|\n\nThis is a pure python interpreter for the\n`Brainfuck \u003chttps://en.wikipedia.org/wiki/Brainfuck\u003e`_ esoteric programming\nlanguage. ``bfi`` is quite fast without requiring any special python implementations\nor compiled extension modules. ``bfi`` Supports Python 2x and 3x.\n\n``bfi`` achieves a significant speedup in the execution of brainfuck\nprograms by first compiling brainfuck source code into an intermediate form.\nThis intermediate form takes advantage of common brainfuck programming constructs\nto execute much faster than if we were to interpret \u0026 execute the brainfuck source directly.\n\nTake moving the cell pointer, as a relativey simple example; to execute ``\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c\u003c``,\nwe could iterate over each ``\u003c`` character, and perform 10 separate \"cell pointer decrement\"\noperations. This would be the slow option. Alternatively, we could collapse those 10 instructions\ninto a single instruction to decrement the cell pointer by 10 in a single operation. This is\ngenerally how the opcodes for the intermediate form work. All runs of cell pointer\nincrement/decrements are collapsed like this, as well as several other similar optimizations.\n\n\nSpeed benchmark\n---------------\n\nHere is a quick comparison between ``bfi`` and two other popular pure-python\nbrainfuck interpreters on github. The time shown is the time that each\ninterpreter took to complete the \"Towers of Hanoi\" program (``hanoi.b``,\navailable in the ``examples`` directory):\n\n+---------------------------------------------------------------------------------+-------------------------------+\n| **Interpreter name**                                                            | **Time to complete hanoi.b**  |\n+=================================================================================+===============================+\n| bfi                                                                             | 1 minute, 9 seconds           |\n+---------------------------------------------------------------------------------+-------------------------------+\n| `pocmo's interpreter \u003chttps://github.com/pocmo/Python-Brainfuck\u003e`_              | 28 minutes, 51 seconds        |\n+---------------------------------------------------------------------------------+-------------------------------+\n| `alexprengere's intrepreter \u003chttps://github.com/alexprengere/PythonBrainFuck\u003e`_ | 1 hour, 7 minutes, 54 seconds |\n+---------------------------------------------------------------------------------+-------------------------------+\n\n(I should note here that alexprengere's interpreter can actually go\nmuch faster than this, but not without using the alternative PyPy interpreter,\nor compiling some stuff. Speeds here are shown without such modifications.\nAll tests were done using the standard CPython 2.7.14 interpreter)\n\nImplementation details\n----------------------\n\n* No change on EOF\n* Tape size is configurable, default is 30,000 cells\n* Cells are one byte, valid values between 0-255. Overflow/underflow wraps\n  around\n\nInstalling\n----------\n\nUse ``pip`` to install:\n\n::\n\n    pip install bfi\n\nUsing the interpreter from the command-line\n--------------------------------------------\n\nOnce installed, the brainfuck interpreter can be invoked from the command line\nusing the ``bfi`` command, or using ``python -m bfi``. Just run ``bfi`` and pass\na brainfuck source file. Several sample Brainfuck programs are provided in the\n``examples`` directory within the installed package-- use ``bfi -e`` to show the\npaths of all installed example files:\n\n::\n\n    $\u003e bfi -e\n\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\bfcl.bf\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\bitwidth.bf\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\collatz.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\eoftest.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\fib.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\gameoflife.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\hanoi.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\hello_world.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\LostKingdom.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\mandel.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\numwarp.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\primes.bf\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\rot13.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\sierpinski.b\n    C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\TheBrainfuckedLoneWolf.b\n\nIn the sample commands below, we will run \"Lost Kingdom\", a text-based adventure\ngame written in Brainfuck:\n\n::\n\n    $\u003e bfi C:\\Users\\Gamer\\AppData\\Roaming\\Python\\Python311\\site-packages\\bfi\\examples\\LostKingdom.b\n\n\nUsing the interpreter in your own code\n--------------------------------------\n\nHere is how you use the ``bfi`` module to execute some Brainfuck code\nnormally (reading data directly from stdin and writing directly to stdout):\n\n::\n\n    \u003e\u003e\u003e import bfi\n    \u003e\u003e\u003e with open('samples/hello_world.b', 'r') as fh:\n    ...     brainfuck_code = fh.read()\n    ...\n    \u003e\u003e\u003e Brainfuck.interpret(brainfuck_code)\n\n    Hello World!\n\n\nHere is how you use the ``bfi`` module to execute some Brainfuck code without\nreading/writing the user's terminal; input is passed a parameter to\n``interpret()``, and any output is returned as a string.\n\n::\n\n    \u003e\u003e\u003e input_data = \"test input\"\n    \u003e\u003e\u003e ret = bfi.interpret(brainfuck_code, stdin=input_data, buffer_stdout=True)\n    \u003e\u003e\u003e print ret\n\n    Hello World!\n\nReference\n---------\n\nDocumentation for the python API is here: `\u003chttps://bfi.readthedocs.io\u003e`_\n\nGratuitous unnecessary extras\n-----------------------------\n\nIn order to make Brainfuck code execute more efficiently, it is compiled into\nan intermediate form that takes advantage of common brainfuck idioms and\nconstructs. This intermediate form consists of 11 opcodes, 8 of which are\nsimilar to the original 8 brainfuck instructions. The following table describes\nthe opcodes:\n\n+-----------------------------------+-----------------------------------------+\n|            **Opcode**             |             **Description**             |\n+===================================+=========================================+\n|          ``move \u003coff\u003e \u003cnum\u003e``     | Moves the cell pointer by ``\u003cnum\u003e``     |\n|                                   | cells. ``\u003coff\u003e`` is unused              |\n+-----------------------------------+-----------------------------------------+\n|          ``sub \u003coff\u003e \u003cnum\u003e``      | Moves the cell pointer by ``\u003coff\u003e``, and|\n|                                   | decrements value of current cell by     |\n|                                   | ``\u003cnum\u003e`` cells                         |\n+-----------------------------------+-----------------------------------------+\n|          ``add \u003coff\u003e \u003cnum\u003e``      | Moves the cell pointer by ``\u003coff\u003e``, and|\n|                                   | increments value of current cell by     |\n|                                   | ``\u003cnum\u003e`` cells                         |\n+-----------------------------------+-----------------------------------------+\n|         ``open \u003coff\u003e \u003clocation\u003e`` | ``\u003clocation\u003e`` is an index into the list|\n|                                   | of program opcodes. If the value of     |\n|                                   | current cell is zero, jump to           |\n|                                   | ``\u003clocation\u003e``. Otherwise, continue     |\n|                                   | execution normally (Same functionality  |\n|                                   | as brainfuck \"[\" instruction, except    |\n|                                   | jump location is stored with opcode).   |\n|                                   | ``\u003coff\u003e`` is unused                     |\n+-----------------------------------+-----------------------------------------+\n|         ``close \u003coff\u003e \u003clocation\u003e``| ``\u003clocation\u003e`` is an index into the list|\n|                                   | of program opcodes. If the value of     |\n|                                   | current cell is zero, continue execution|\n|                                   | normally. Otherwise, jump to            |\n|                                   | ``\u003clocation\u003e`` (Same functionality as   |\n|                                   | brainfuck \"]\" instruction, except jump  |\n|                                   | location is stored with opcode). In all |\n|                                   | cases the cell pointer will be moved by |\n|                                   | ``\u003coff\u003e``                               |\n+-----------------------------------+-----------------------------------------+\n|             ``input \u003coff\u003e``       | Moves the cell pointer by ``\u003coff\u003e``,    |\n|                                   | then reads one character of input and   |\n|                                   | writes to current cell                  |\n+-----------------------------------+-----------------------------------------+\n|             ``output \u003coff\u003e``      | Moves the cell pointer by ``\u003coff\u003e``,    |\n|                                   | then prints value of current cell as    |\n|                                   | an ASCII character                      |\n+-----------------------------------+-----------------------------------------+\n|             ``clear \u003coff\u003e``       | Moves the cell pointer by ``\u003coff\u003e``,    |\n|                                   | then sets the value of current cell to  |\n|                                   | zero                                    |\n+-----------------------------------+-----------------------------------------+\n|  ``copy \u003coff\u003e {\u003co\u003e:\u003cm\u003e,... }``    | Moves the cell pointer by ``\u003coff\u003e``,    |\n|                                   | then for each key/value pair, sets the  |\n|                                   | value of the cell at (current cell +    |\n|                                   | ``\u003co\u003e``) to be (value of current cell * |\n|                                   | ``\u003cm\u003e``)                                |\n+-----------------------------------+-----------------------------------------+\n|             ``scanl \u003coff\u003e``       | Moves the cell pointer by ``\u003coff\u003e``,    |\n|                                   | then decrements the cell pointer until  |\n|                                   | it points at a cell containing 0        |\n+-----------------------------------+-----------------------------------------+\n|             ``scanr \u003coff\u003e``       | Moves the cell pointer by ``\u003coff\u003e``,    |\n|                                   | then increments the cell pointer until  |\n|                                   | it points at a cell containing 0        |\n+-----------------------------------+-----------------------------------------+\n\nIf you *really want to*, you can actually view a brainfuck program in this\nintermediate form, by using the ``bfi.parse`` method and printing the resulting\nopcodes:\n\n::\n\n    \u003e\u003e\u003e with open('bfi/examples/mandel.b', 'r') as fh:\n    ...     program = fh.read()\n    ...\n    \u003e\u003e\u003e opcodes = bfi.parse(program)\n    \u003e\u003e\u003e for c in opcodes: print c\n    ...\n\n    add 0 13\n    copy 0 {1: 2, 4: 5, 5: 2, 6: 1}\n    add 5 6\n    sub 1 3\n    add 10 15\n    open 0 12\n    open 0 7\n    close 9 6\n    add 0 1\n    open 0 10\n\n    ... (long output, truncated ...)\n\nAnd of course, you can execute the compiled opcodes as many times as you like\nusing ``bfi.execute``.\n\nExample Brainfuck programs\n--------------------------\n\nI have included several random Brainfuck programs that I've found in various\nplaces. I didn't write any of these programs, I just copied them as-is\nfrom other public sources. Descriptive comments (and author's name, in some\ncases) can be seen in the Brainfuck source files themselves.\n\nA description of the example Brainfuck programs included with this package\nfollows:\n\n* **bfcl.bf**: A Brainfuck-to-ELF translator, in Brainfuck. Reads in Brainfuck\n  source from stdin and writes a Linux ELF file to stdout\n\n* **bitwidth.bf** Assorted tests for Brainfuck interpreter/compiler correctness\n\n* **collatz.b** A demonstration of the Collatz problem in Brainfuck\n\n* **eoftest.b** Tests EOF behaviour of brainfuck interpreters/compilers\n\n* **fib.b** Prints a neverending fibonacci sequence\n\n* **gameoflife.b** Conway's Game of Life in Brainfuck\n\n* **hanoi.b** Towers of Hanoi in Brainfuck\n\n* **hello_world.b** Classic \"hello, world!\" in Brainfuck\n\n* **LostKingdom.b** A text-based adventure game in Brainfuck\n\n* **mandel.b** An ASCII  mandelbrot fractal set viewer in Brainfuck\n\n* **numwarp.b** Prints an enlarged ASCII representation of numbers entered by\n  the user\n\n* **primes.bf** Prints prime numbers\n\n* **rot13.b** Prints the ROT13 encoding of the string entered by the user\n\n* **sierpinksi.b** Displays the Sierpinksi triangle\n\n* **TheBrainfuckedLoneWolf.b** ASCII asteroids-inspired top-down shooter game\n  in Brainfuck\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feriknyquist%2Fbfi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feriknyquist%2Fbfi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feriknyquist%2Fbfi/lists"}