{"id":23050204,"url":"https://github.com/questnetwork/quest-os-js","last_synced_at":"2025-10-06T10:32:09.746Z","repository":{"id":105959255,"uuid":"293765304","full_name":"QuestNetwork/quest-os-js","owner":"QuestNetwork","description":"JavaScript Implementation of the Quest Network Operating System. Drop-In solution to build Quest Network, IPFS and Ethereum dApps.","archived":false,"fork":false,"pushed_at":"2020-11-01T23:11:52.000Z","size":325,"stargazers_count":7,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-01-20T23:11:19.600Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/QuestNetwork.png","metadata":{"files":{"readme":"README.md","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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-09-08T09:36:55.000Z","updated_at":"2023-05-14T07:23:32.000Z","dependencies_parsed_at":null,"dependency_job_id":"7e4bda0b-c2d9-4afb-897a-e5120e869905","html_url":"https://github.com/QuestNetwork/quest-os-js","commit_stats":{"total_commits":237,"total_committers":3,"mean_commits":79.0,"dds":"0.38396624472573837","last_synced_commit":"b8de2fcda1fb99e7ec3c477d4d6134bb47ef0be0"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QuestNetwork%2Fquest-os-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QuestNetwork%2Fquest-os-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QuestNetwork%2Fquest-os-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/QuestNetwork%2Fquest-os-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/QuestNetwork","download_url":"https://codeload.github.com/QuestNetwork/quest-os-js/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235519884,"owners_count":19003201,"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","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":"2024-12-15T23:20:25.210Z","updated_at":"2025-10-06T10:32:09.397Z","avatar_url":"https://github.com/QuestNetwork.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Completion](https://img.shields.io/badge/completion-14%25-orange) ![Help Wanted](https://img.shields.io/badge/%20-help--wanted-%23159818) ![Version 0.9.4](https://img.shields.io/badge/version-v0.9.4-green) ![Version 0.9.5](https://img.shields.io/badge/version-v0.9.5-blue) ![Sponsors](https://img.shields.io/badge/sponsors-0-red) [![Join the chat at https://gitter.im/QuestNetwork/qOS](https://badges.gitter.im/QuestNetwork/qOS.svg)](https://gitter.im/QuestNetwork/qOS?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n# qOS\n\n## Lead Maintainer\n\n[StationedInTheField](https://github.com/StationedInTheField)\n\n## Description\nUnified API for the QuestNetwork dStack. Use with our example app: [qDesk](https://github.com/QuestNetwork/qDesk).\n\nMain strategy is to create a Quest Network / IPFS / Ethereum interface that even kids can easily understand.\n\nqOS offers encrypted channels, persistent storage, peer management, timelines, posts and more. It is used to load add-on modules, like [quest-coral-js](https://github.com/QuestNetwork/quest-coral-js) to use [IPFS DAGs](https://docs.ipfs.io/concepts/merkle-dag/), or [quest-dolphin-js](https://github.com/QuestNetwork/quest-dolphin-js) to use [IPFS GossipSub](https://blog.ipfs.io/2020-05-20-gossipsub-v1.1/).\n\n## Security\n\n![Completion 1.0.0](https://img.shields.io/badge/OAEP-4096%20Bit-green) ![EC](https://img.shields.io/badge/EC-P\u0026#8208;521-green) ![AES](https://img.shields.io/badge/AES-256%20Bit-yellow)\n\nqOS uses [4096 Bit RSA-OAEP](https://en.wikipedia.org/wiki/RSA_(cryptosystem)#Operation) encryption, [256 Bit AES-CBC](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) encryption and [NIST P-521 EC](https://en.wikipedia.org/wiki/Elliptic-curve_cryptography#Fast_reduction_(NIST_curves)) signatures.\n\n\n## Installation \u0026 Usage\n\n``npm install @questnetwork/quest-os-js@0.9.4``\n\n**OR**  \n\n```\ngit clone https://github.com/QuestNetwork/quest-os-js \u0026\u0026 cd quest-os-js \u0026\u0026 git checkout 0.9.4 \u0026\u0026 cd ..\n```\n\n## API\n\n\n### async boot(config)\n\nBoots the operating system. The GitHub branches master/0.9.2/0.9.3+ boot with:\n\nJavaScript/NodeJS\n```javascript\nimport { qOS } from '@questnetwork/quest-os-js'\n// configure with a bootstrap swarm peer, for testing you can use:\nlet config = {\n  ipfs: {\n        Swarm: [\u003cswarm star peer ip\u003e,\u003cswarm star peer ip\u003e],\n        API: '',\n        Gateway: ''\n  },\n  version: \u003cversion\u003e\n  dev: \u003ctrue/false\u003e\n};\n// boot the operating system\nqOS.boot().then( () =\u003e {\n  //the operating system is online, build the future\n})\n```\n\nTypeScript/Angular Service\n```javascript\nimport { Injectable } from '@angular/core';\nimport { qOS }  from '@questnetwork/quest-os-js';\nimport * as swarmJson from '../swarm.json';\nimport  packageJson from '../../../package.json';\nconst version = packageJson.version;\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class QuestOSService {\n  public os;\n  ready = false;\n  config;\n  constructor() {\n    this.config = {\n      ipfs: {\n        Swarm: swarmJson['ipfs']['Swarm'],\n        API: '',\n        Gateway: ''\n      },\n      version: version,\n      dev: swarmJson['dev']\n    };\n    this.os = qOS;\n  }\n  async boot(){\n      try{\n        await this.os.boot(this.config);\n        this.ready = true;\n      }\n      catch(e){\n        throw(e);\n      }\n  }\n}\n```\n\n### isReady()\n\nReturns true once boot is complete, otherwise returns false.\n\n```javascript\nif(\u003cos\u003e.isReady()){\n  console.log(\"Ready To Sign In\");\n};\n```\n\n\n### onReady()\n\nReturns a Subject that pushes next when boot is complete\n\n```javascript\nif(\u003cos\u003e.onReady().subsribe( () =\u003e {\n  console.log(\"Ready To Sign In\");\n});\n```\n\n\n### reboot()\n\nReboots the entire system\n\n```javascript\n\u003cos\u003e.reboot();\n```\n\n### enableSaveLock()\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nLocks the system from saving any changes\n```javascript\n\u003cos\u003e.enableSaveLock();\n```\n\n### disableSaveLock()\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nUnlocks the system from saving changes and saves changes normally\n```javascript\n\u003cos\u003e.disableSaveLock();\n```\n\n\n### setStorageLocation(location)\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nSets the storage location for the app. Normally Quest OS does this automatically and you do not need to call this function.\nPossible locations are: `\"Download\"`,`\"LocalStorage\"` or `\"ConfigFile\"`\n\n```javascript\n\u003cos\u003e.setStorageLocation(\"LocalStorage\");\n```\n\n### getStorageLocation(location)\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nReturns a string with the current storage location\n\n```javascript\n\u003cos\u003e.getStorageLocation();\n```\n\n\n### setPwd(pwd)\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nSets the password to be used with the next signIn attempt.\n\n```javascript\n\u003cos\u003e.setPwd(pwd);\n```\n\n### setPassword(old,new)\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nSets the password to be used for encryption.\nWhen you don't set this before sign in all data is encrypted with a random password.\n\n```javascript\n\u003cos\u003e.setPassword('','first-password');\n```\n\n### signIn(config = {})\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nActivates Accounts. Empty config creates a new account\n```javascript\n\u003cos\u003e.signIn({});\n```\n### signOut()\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nDeactivates Accounts And Restarts The Interface On The Web, Closes The Current Window In Electron\n```javascript\n\u003cos\u003e.signOut();\n```\n\n### onSignIn()\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nReturns a subscribable Subject that fires when the account is signed in.\n```javascript\n\u003cos\u003e.onSignIn().subscribe( () =\u003e {\n  console.log(\"Hello Universe\");\n});\n```\n\n### isSignedIn()\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js)\n\nReturns a boolean true or false\n```javascript\nif(\u003cos\u003e.isSignedIn()){\n  console.log(\"Hello Universe\");\n};\n```\n\n### channel\n\n#### async channel.create(dirtyChannelName, parentFolderId = \"\")\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js) [![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nReturns the clean channel name\n```javascript\nlet claenChannelName = await \u003cos\u003e.channel.create('propaganda');\n```\n\n#### channel.remove(cleanChannelName)\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js) [![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nRemoves a channel\n```javascript\n\u003cos\u003e.channel.remove('propaganda----1234');\n```\n\n#### channel.listen(cleanChannelName)\n[![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nReturns a Subject that forwards non-system channel messages.\n```javascript\n\u003cos\u003e.channel.listen('propaganda----1234').subscribe( msg ){\n  console.log(msg);\n}\n```\n\n#### async channel.publish(cleanChannelName, message, type = 'CHANNEL_MESSAGE')\n[![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nReturns a Subject that forwards non-system channel messages.\n```javascript\nawait \u003cos\u003e.channel.publish('propaganda----1234',\"Hello Universe\");\n```\n\n### channel.challenge\n\n#### channel.challenge.enable(cleanChannelName)  \n[![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nOpens the channel to everyone who can solve the Captcha provided by [Quest Image Captcha JS](https://github.com/QuestNetwork/quest-image-captcha-js)\n```javascript\n\u003cos\u003e.channel.challenge.enable('propaganda----1234');\n```\n\n#### channel.challenge.disable(cleanChannelName)\n[![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nCloses the channel to invite only participation\n```javascript\n\u003cos\u003e.channel.challenge.disable('propaganda----1234');\n```\n\n#### channel.challenge.isEnabled(cleanChannelName)  \n[![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\n```javascript\nif(\u003cos\u003e.isEnabled()){\n  console.log(\"Hello Universe\");\n};\n```\n\n### channel.invite\n\n#### channel.invite.create(cleanChannelName,newInviteCodeMax, exportFolders = false)  \n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js) [![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nCreates a new channel invite, specify max uses of this invite code and whether or not to include your folder structure.\n```javascript\n\u003cos\u003e.channel.invite.create('propaganda----1234',5,true);\n```\n\n#### channel.invite.remove(cleanChannelName,link)\n[![Bee](https://img.shields.io/badge/process-Bee-yellow)](https://github.com/QuestNetwork/quest-bee-js) [![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nRemoves a channel invite\n```javascript\n\u003cos\u003e.channel.invite.remove('propaganda----1234',\"5448495320495320414e2045585452454d454c59204c4f4e4720414e4420494e56414c494420494e5649544520434f4445\");\n```\n\n#### channel.invite.get(channel)\n[![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nGets all invites for a channel\n```javascript\nlet invites = \u003cos\u003e.channel.invite.get('propaganda----1234');\n```\n\n\n#### channel.invite.get(channel)\n[![Ocean](https://img.shields.io/badge/process-Ocean-blue)](https://github.com/QuestNetwork/quest-ocean-js)\n\nGets all invites for a channel\n```javascript\nlet invites = \u003cos\u003e.channel.invite.get('propaganda----1234');\n```\n\n\n**Unfortunately nobody is working on a detailed API documentation yet, until then check out the source in [qDesk Messages](https://github.com/QuestNetwork/quest-messenger-js) 0.9.3+ to see how to use the OS.**\n\nWe recommend to use our [quest-cli](https://github.com/QuestNetwork/quest-cli) to test and build the package. It allows you to bootstrap your Quest Network apps with the same peers and settings.\n\nPro Tip: Put a file in your `/bin` that runs the quest-cli like so `node /path/to/quest-cli/index.js` from any folder on your system. It's much nicer!\n\n## Features\n\n**0.9.2**\n- Encrypted P2P Channels\n- API for high level IPFS functionality\n- Saves Config\n- [Quest Ocean JS](https://github.com/QuestNetwork/quest-ocean-js)\n- [Quest Bee JS](https://github.com/QuestNetwork/quest-bee-js)\n\n\n**0.9.3**\n- [Quest Social JS](https://github.com/QuestNetwork/quest-social-js)\n- Documentation Extended\n- Easier Access\n- Offer \"LocalStorage\" As A Storage Container On The Web To Stay Signed In\n\n**0.9.4**\n- Change Peer Configuration in browser, Electron and on NodeJS\n- Module Upgrades\n- Password\n\n**0.9.5**\n- Account Name\n\n## Roadmap\n\n**0.9.5**\n- [Quest Quorum Module](https://github.com/QuestNetwork/quest-quorum-js)\n- Democratically block or mute peers\n- Faux requests. Send request in channel, wait for response, deliver response as if it was an http request.\n\n**0.9.6**\n- Ethereum Payment Integration Beta\n\n**0.9.7**\n- Quest Worker To Render `.blend` Files And Earn Rewards\n\n## Support Us\nPlease consider supporting us, so that we can build a non-profit for this project (ツ)\n\n| Ethereum| Bitcoin |\n|---|---|\n| `0xBC2A050E7B87610Bc29657e7e7901DdBA6f2D34E` | `bc1qujrqa3s34r5h0exgmmcuf8ejhyydm8wwja4fmq`   |\n|  \u003cimg src=\"doc/images/eth-qr.png\" \u003e   | \u003cimg src=\"doc/images/btc-qr.png\" \u003e |\n\n\n## License\nGNU Affero GPLv3\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquestnetwork%2Fquest-os-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquestnetwork%2Fquest-os-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquestnetwork%2Fquest-os-js/lists"}