{"id":51054062,"url":"https://github.com/sokorototo/fuckbrain","last_synced_at":"2026-06-22T19:32:42.530Z","repository":{"id":43069404,"uuid":"369834379","full_name":"sokorototo/fuckbrain","owner":"sokorototo","description":"A simple, customizable and extendable interpreter framework written in JavaScript.","archived":false,"fork":false,"pushed_at":"2022-03-20T19:45:54.000Z","size":634,"stargazers_count":7,"open_issues_count":2,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-30T15:41:07.114Z","etag":null,"topics":["brainfuck","framework","interpreter","javascript"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sokorototo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-22T14:53:04.000Z","updated_at":"2022-09-28T20:43:35.000Z","dependencies_parsed_at":"2022-09-03T13:25:19.208Z","dependency_job_id":null,"html_url":"https://github.com/sokorototo/fuckbrain","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sokorototo/fuckbrain","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sokorototo%2Ffuckbrain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sokorototo%2Ffuckbrain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sokorototo%2Ffuckbrain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sokorototo%2Ffuckbrain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sokorototo","download_url":"https://codeload.github.com/sokorototo/fuckbrain/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sokorototo%2Ffuckbrain/sbom","scorecard":{"id":836649,"data":{"date":"2025-08-11","repo":{"name":"github.com/sokorototo/fuckbrain","commit":"4ac23d1052005ef4063f6d10d0f3054b5602bed2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/node.js.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":"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":"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":"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":"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":"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":"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":"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/node.js.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/sokorototo/fuckbrain/node.js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/node.js.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/sokorototo/fuckbrain/node.js.yml/master?enable=pin","Warn: npmCommand not pinned by hash: .github/workflows/node.js.yml:30","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 npmCommand 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":"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":"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":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"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":"Vulnerabilities","score":8,"reason":"2 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-23T19:14:08.853Z","repository_id":43069404,"created_at":"2025-08-23T19:14:08.853Z","updated_at":"2025-08-23T19:14:08.853Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34663524,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"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":["brainfuck","framework","interpreter","javascript"],"created_at":"2026-06-22T19:32:38.568Z","updated_at":"2026-06-22T19:32:42.519Z","avatar_url":"https://github.com/sokorototo.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/sokorototo/fuckbrain/master/media/fuckbrain%20logo.png\"alt=\"Fuckbrain logo\" width=\"180\" height=\"180\"\u003e\n\u003c/p\u003e\n\u003ch1 align=center\u003e\n  \u003cstrong\u003ef*ckbrain\u003c/strong\u003e\n\u003c/h1\u003e\n\u003cp align=center\u003e Another \u003ca href=\"https://esolangs.org/wiki/Brainfuck\"\u003eBrainfuck\u003c/a\u003e interpreter written in JavaScript,\u003c/p\u003e\n\u003cp align=center\u003e - Customizable and Easy to use · Works in the Browser, Node and Deno - \u003c/p\u003e\n\u003cp align=center\u003e\n  \u003ca href=\"https://github.com/sokorototo/fuckbrain\"\u003e\u003cimg alt=\"NPM\" src=\"https://img.shields.io/npm/l/fuckbrain\"\u003e\u003c/a\u003e |\n  \u003ca href=\"https://www.npmjs.com/package/fuckbrain\"\u003e\u003cimg alt=\"npm\" src=\"https://img.shields.io/npm/v/fuckbrain\"\u003e\u003c/a\u003e |\n  \u003ca href=\"https://www.npmjs.com/package/fuckbrain\"\u003e\u003cimg alt=\"npm\" src=\"https://img.shields.io/npm/dw/fuckbrain\"\u003e\u003c/a\u003e |\n  \u003ca href=\"https://bundlephobia.com/package/fuckbrain\"\u003e\u003cimg alt=\"npm bundle size\" src=\"https://img.shields.io/bundlephobia/min/fuckbrain\"\u003e\u003c/a\u003e |\n  \u003ca href=\"https://github.com/sokorototo/fuckbrain/issues\"\u003e\u003cimg alt=\"GitHub issues\" src=\"https://img.shields.io/github/issues/sokorototo/fuckbrain\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=center\u003e\n \u003ca href=\"https://www.npmjs.com/package/fuckbrain\"\u003enpm\u003c/a\u003e | \u003ca href=\"#deno\"\u003edeno.land\u003c/a\u003e | \u003ca href=\"https://sokorototo.github.io/fuckbrain/\"\u003eTry it\u003c/a\u003e\n\u003c/p\u003e\n\n----\n\n### 🐣  _Introduction_\n\n##### _fuckbrain_ is a dead simple brainfuck interpreter. It has no dependencies nor bloat. Uses a loop instead of recursion. Covers the full, ( yet small ) brainfuck language spec, correctly. _fuckbrain_ also comes with detailed error reporting and customizable input and output streaming. The interpreter does not offer any form of optimizations, yet. Besides various aspects of a given `Machine` instance, ( what runs the .bf ) can be customized; bits per cell, length of the tape and its `InstructionSet`. You can try a demo [here](https://sokorototo.github.io/fuckbrain/)\n\n----\n\n### 🥼 _Why I made this_\n\n- I love code, its what I do 🥽.\n- I was watching a video by [TheHappieCat](https://youtu.be/-3C200nCwpk), and I thought to myself, \"Hmm, I could probably write a brainfuck interpreter.\"\n- To prove to myself I ain't a cabbage-potato programmer. ¯\\\\\\_(ツ)_/¯\n- I wanted to learn how to write an interpreter.\n- I want to design a programming language someday, an [esotlang](https://en.wikipedia.org/wiki/Esoteric_programming_language) maybe?\n\n----\n\n### ⏬ *Installation*\n\n##### CDN\n\nDeliver the package via a cdn:\n\n- jsdelivr:\n\n  ```http\n  https://cdn.jsdelivr.net/npm/fuckbrain\n  ```\n\n- unpkg:\n\n  ```http\n  https://unpkg.com/fuckbrain\n  ```\n\n##### npm\n\n```bash\nnpm install fuckbrain\n```\n\n##### yarn\n\n```bash\nyarn add fuckbrain\n```\n\n##### Embedded\n\nInclude the file `fuckbrain.min.js` , from `build/` in your project directory. Then:\n\n- Browser:\n\n  ```html\n  \u003cscript src=\"path/to/fuckbrain.min.js\"\u003e\n  ```\n\n- Node:\n\n  ```javascript\n  const Machine = require(\"path/to/fuckbrain.min.js\");\n  ```\n\n##### ES6 Module\n\nIn the build directory is an es6 module of the library. The main|default import of the module id the `Machine` class:\n\n```javascript\nimport Machine from \"fuckbrain.min.mjs\";\n```\n\n##### Deno\n\n```javascript\nimport Machine from \"https://cdn.jsdelivr.net/npm/fuckbrain/build/fuckbrain.min.mjs\";\n```\n\n----\n\n### ⛽ ***Prerequisite***\n\nTo ensure that _fuckbrain_ [just works](https://www.youtube.com/watch?v=YPN0qhSyWy8) ensure the following JavaScript features are available; If not get some [polyfills](https://github.com/zloirock/core-js) or consider using a transpiler 🐱‍🐉.\n\n\u003e [Iterators] (\u003chttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators\u003e)*\n\u003e\n\u003e ​ [Symbol.iterator] (\u003chttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterator_protocol\u003e)*\n\u003e\n\u003e [Maps] (\u003chttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\u003e)*\n\n----\n\n### 🛠 *Basic Usage*\n\nTo run basic brainfuck code, with as little configuration as possible:\n\n```javascript\nimport Machine from \"fuckbrain.min.mjs\";\n\nlet code = \"++++++++++[\u003e+++++++\u003e++++++++++\u003e+++\u003e+\u003c\u003c\u003c\u003c-]\u003e++.\u003e+.+++++++..+++.\u003e++.\u003c\u003c+++++++++++++++.\u003e.+++.------.--------.\u003e+.\u003e.\";\n\nlet myMachine = new Machine();\n\nlet output = myMachine.run(code);\n\nconsole.log(output);\n// -\u003e [\"H\", \"e\", \"l\", \"l\", \"o\", \",\", \" \", \"w\", \"o\", \"r\", \"l\", \"d\", \"!\"]\n\nconsole.log(output.join(\"\"));\n// Hello, world!\n```\n\nBecause brainfuck code outputs values one byte at a time, the resultant  output is an array of ASCII `char` values. As you would expect, it also expects input one at a time. Brainfuck ingests input as integers, depending on your cellSize. To send data to brainfuck, _fuckbrain_ employs the standard [Iterator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterator_protocol) protocol to allow the user to use their own input stream implementation( **input what you want, how you want, when you want it, as long as it's an integer** ). Anyways, its quite easy to produce a stream of integers  from a `String`, thanks to ASCII character conversion and a static helper method in the `Machine` class, `Machine.StringInputGenerator`:\n\n```javascript\nimport Machine from \"fuckbrain.min.mjs\";\n\nlet reverse = \"+[\u003e,]\u003c-[+.\u003c-]\"; // Reverses its input and spits it out\n\nlet myMachine = new Machine();\n\nlet output = myMachine.run(brainfuck, Machine.StringInputGenerator(\"ToiletPaper\"));\nconsole.log(output.join(\"\"));\n// repaPtelioT\n```\n\nA **`Machine.BrowserPromptInputGenerator`** method exists so a [prompt](https://developer.mozilla.org/en-US/docs/Web/API/Window/prompt) popup appears in the browser when input is needed. **Do not use this generator in node.js**. This method takes an argument, a question to be shown on the popup, defaults to _\"[INPUT] Brainfuck asks of your input, leave empty to exit:\"_. An empty answer terminates the stream, probably inform the user:\n\n```javascript\nimport Machine from \"fuckbrain.min.mjs\";\n\nlet reverse = \"+[\u003e,]\u003c-[+.\u003c-]\"; // Reverses its input and spits it out\n\nlet myMachine = new Machine();\n\nlet output = myMachine.run(reverse, Machine.BrowserPromptInputGenerator());\n\nconsole.log(output.join(\"\"));\n// sapmuLapmU\n```\n\nOutput is also available instantaneously, just provide an object with a **`write`** method as a third parameter to **`machine.run()`** and this method will be called every time output is available. You can just wait for execution to complete and receive an array as a return value of **`machine.run()`**:\n\n```javascript\nimport Machine from \"fuckbrain.min.mjs\";\n\nlet tt = \"--------[--\u003e+++\u003c]\u003e..\"; // The text \"tt\"\n\nlet myMachine = new Machine();\n\nlet outputWriter = {\n  data: [],\n  write( char ){\n    this.data.push(\"s\" + char + \"er\")\n  },\n  complete( output ){\n    // Called with the same output that would be returned by machine.run()\n    console.log( output ); // -\u003e [ \"t\", \"t\" ]\n  }\n};\n\nmyMachine.run(tt, Machine.BrowserPromptInputGenerator(), outputWriter);\nconsole.log(myWriter.data.join(\"\"));\n// sterster\n```\n\n----\n\n### 🦸‍♂️ Advanced Usage\n\n\u003e **All these settings are optional and have defaults if not defined;**\n\n- _Manually set the length of the tape_:\n\n  ```javascript\n  import Machine from \"fuckbrain.min.mjs\";\n\n  let myMachine = new Machine({\n  // 4500 cells, defaults to 30000\n  length: 4500\n  });\n  ```\n\n- *Specify the cell size, ( **number of bits per cell** )*:\n\n  ```javascript\n  import Machine from \"fuckbrain.min.mjs\";\n\n  let myMachine = new Machine({\n  // 16 bits per cell, -- MUST be a power of 2, defaults to 8 bits per cell --\n  cellSize: 16\n  });\n  ```\n\n- _Define your own custom instructions:_ Define a function that is bound to an instruction. This function is called when the instruction is met along the tape. It also gives the instruction meaning and prevents it from getting filtered out during optimizations. Use this to add debugging functionality or extend the **`InstructionSet`** in many various creative and *spooky* ways. To maintain basic functionality I advise extending the built-in instruction set instead of building on from the ground up on your own, you can if you want tho;\n\n  ```javascript\n  import Machine from \"fuckbrain.min.mjs\";\n\n  let custom = Machine.InstructionSet(); // A JavaScript map\n\n  custom.set(\"!\", (machine, code, input, output) =\u003e {\n  // A debug instruction that spits out some information\n  console.log(`[STACK, POINTER]`, machine.stack, machine.pointer)\n  });\n\n  let myMachine = new Machine({\n  InstructionSet: custom\n  });\n  ```\n\n  The function passed takes four arguments; **`machine`** a reference to the machine instance running the brainfuck code, this includes all its properties and methods,  **`code`** an array containing all instructions waiting to be executed ( NOTE this is not the code passed to  **`machine.run()`** as a first argument but a filtered version containing only _viable_ instructions ),  **`input`**a reference to the input iterator passed to **`machine.run()`**as a second argument, **`output`** a reference to the output object passed as the third argument to  **`machine.run()`**.\n\n### ⚙ *The Machine Instance*\n\nA \"machine\" is what runs your brainfuck. I assume you know how brainfuck works. It has a **`tape`**, which is basically an \"infinite\" array of cells initialized at zero. A **`pointer`** which points to a specific cell in the **`tape`**. Also, your brainfuck code is an array of instructions. An execution pointer points to an instruction in that array. A **`machine`** has all these represented as properties, you can access and them alter them:\n\n```javascript\nimport Machine from \"fuckbrain.min.mjs\";\n\nlet machine = new Machine();\n\nmachine.pointer // ( Number ) The memory pointer's location along the tape\n\nmachine.execution // ( Number ) The instruction pointer's location along the instruction tape\n\nmachine.tape // ( TypedArray ) The tape\n\nmachine.stack // [ Number ] The stack, used for storing the last location of a \"[\" instruction within the instruction tape\n\nmachine.metadata // ( Object ) This allows you to attach some arbitrary data\n\nmachine.terminate() // Terminates and resets the machine\n```\n\nAll these properties are reset after your brainfuck is done executing. No need to create another machine instance to run more brainfuck, just **`machine.run()`**  again.\n\n----\n\n### 🤘 *Example*\n\nWe want to give brainfuck the following features:\n\n- The pointer has a storage cell that it carries  around, a sort of bag.\n- It can read the value of the cell it's currently on and put it into storage with **`v`**.\n- It inject the value currently in storage into the cell it's currently on with **`^`**.\n- Prematurely terminate execution with **`#`**.\n\n```javascript\nimport Machine from \"fuckbrain.min.mjs\";\n\nlet custom = Machine.InstructionSet(); // A JavaScript map\n\ncustom.set(\"v\", (machine) =\u003e {\n // Read data from current cell and put to storage\n machine.metadata.storage = machine.tape[machine.pointer];\n});\n\ncustom.set(\"^\", (machine) =\u003e {\n // Read data from storage and inject into current cell\n machine.tape[machine.pointer] = machine.metadata.storage || machine.tape[machine.pointer];\n});\n\ncustom.set(\"#\", (machine) =\u003e {\n // Kill the machine\n machine.terminate();\n});\n\nlet machine = new Machine({ InstructionSet: custom });\n\nlet code = \"++++v\u003e^\u003c.\u003e.#\u003e+[\u003e+]\";\nlet output = machine.run(code);\nconsole.log(output.join(\"\")); // ♦♦\n\n// I call this brainfuck flavour: \"bagfuck\"\n```\n\n----\n\n### 👌 *Implementation Details*\n\n- **`0 - 1 == 255`**, values wrap around.\n- The memory pointer does not wrap around, therefore **`machine.pointer - 0 == 0`**\n- If input **`Iterator`** finishes all further input prompts default to **`0`**\n- Outputs `Number` values by default. Input in`String` format.\n\n\u003e These are for the default **Machine.InstructionSet**, you can obviously create your own instruction set from bottom to top with vastly different rules.\n\n----\n\n### 🎁 *Extras*\n\n- I would really love some feedback.\n- For any issues, go [here](https://github.com/sokorototo/fuckbrain/issues).\n- Give me your best and worst opinions on my code.\n- Please leave a [star](https://github.com/sokorototo/fuckbrain/stargazers)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsokorototo%2Ffuckbrain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsokorototo%2Ffuckbrain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsokorototo%2Ffuckbrain/lists"}