diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d53963e0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +# See https://help.github.com/ignore-files/ for more about ignoring files. + +# dependencies +/node_modules + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +yarn.lock + +glyph*.svg +stroke*.svg +public +dist +/src/resources +/src/data +/src/content +/src/layouts/partials/indexes +/src/static/fonts +/src/static/app.css +/src/static/app.js diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9e133f9f..fc429b72 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -5,6 +5,7 @@ Please ensure your pull request adheres to the following guidelines: - Search previous suggestions before making a new one, as yours may be a duplicate. - If you just created something, wait at least a couple of weeks before submitting. - Make an individual pull request for each suggestion. +- Add the idea to [data][./data] and then run `node run build`. - Use the following format: `[resource name](link) - Description.` - New categories, or improvements to the existing categorization are welcome. - Keep descriptions short and simple, but descriptive. @@ -13,7 +14,7 @@ Please ensure your pull request adheres to the following guidelines: - Check your spelling and grammar. - Make sure your text editor is set to remove trailing whitespace. - The pull request should have a useful title and include a link to the package and why it should be included. -- If you are submitting an article, include the date before, and sort if in the list by date. Example: `* YYYY-MM-dd: [)`. +- If you are submitting an article, don't forget to include the date. - Submit products when they are useable, or at a state which has something to show which is awesome in itself. This cuts down on half-finished implementations. Thank you for your suggestions! diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..b9a954cc --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +build: + npm --version + node --version + npm install + npm run lint + npm run build \ No newline at end of file diff --git a/README.md b/README.md index 569372a3..f5e7d465 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,9 @@ place to ask about it might be in [ipfs/apps](https://github.com/ipfs/apps) or ## Table of Contents - [Apps](#apps) - - [Single page Webapps](#single-page-webapps) +- [Articles](#articles) - [Tools](#tools) - [Videos](#videos) -- [Archives](#archives) -- [Articles and Press](#articles-and-press) - - [Articles independently hosted on IPFS](#articles-independently-hosted-on-ipfs) - [Discussions](#discussions) - [Contribute](#contribute) - [Want to hack on IPFS?](#want-to-hack-on-ipfs) @@ -29,118 +26,105 @@ place to ask about it might be in [ipfs/apps](https://github.com/ipfs/apps) or ## Apps -* [akasha](http://akasha.world/) - A Next-Generation Social Media Network, powered by Ethereum and embedded into IPFS. -* [Alexandria](http://www.alexandria.io/learn/#integrated-technologies) - Decentralized content publishing / monetization platform. -* [Arbore](http://arbo.re) - A friend-to-friend file-sharing app build on top of IPFS. -* [Arpadyne](https://arpadyne.computes.com) - The New Internet - DNS powered by OrbitDB. Content delivered via IPFS. -* [beets](https://github.com/beetbox/beets) - Beets has a plugin which allows for easy sharing of music libraries using IPFS -* [Blokaly](https://github.com/blokaly) - A badge issuing, sharing and display platform based on IPFS. -* [Boards](https://ipfs.io/ipns/boards.ydns.eu) - Distributed social platform that runs in the browser. [GitHub](https://github.com/fazo96/ipfs-boards) -* [Cohort](https://github.com/zignig/cohort) - A golang app to preset a threejs interface and get all of its assets out of IPFS. -* [Computes](https://computes.io) - Computes.io is a distributed supercomputer powered by IPFS. -* [dapple](https://github.com/nexusdev/dapple) - Dapple is a Solidity developer multitool designed to manage the growing complexity of interconnected smart contract systems. -* [digx](https://digix.global) - Digix is an asset-tokenisation platform built on Ethereum and IPFS. -* [dtube](https://d.tube) - Distributed video sharing with steem.it intergrations, using ipfs for backend storage. -* [Ethlance](http://ethlance.com) - First completely decentralised job market platform built on Ethereum and IPFS. [Github](https://github.com/madvas/ethlance) -* [git-ipfs-rehost](https://github.com/whyrusleeping/git-ipfs-rehost) - A script to rehost your git repos in ipfs. -* [Global Upload](https://globalupload.io/) - File transportation service for IPFS, upload files to the future of distributed web. -* [HydrusNetwork](https://github.com/hydrusnetwork/hydrus) - A booru-style media tagging application with a multitude of features, recently added basic ipfs support. -* [InterPlanetary Wayback](https://github.com/oduwsdl/ipwb) - Web Archive (WARC) indexing and replay using IPFS. -* [Interplanetary Wiki](https://github.com/jamescarlyle/ipfs-wiki) - Wiki built on top of IPFS -* [IPFS Event Drop](https://github.com/travisperson/ipfs-event-drops) - An app that allows for improved visualization of ipfs events. -* [IPFS Drive](http://ipfs-drive.ydns.eu) - In browser file manager for IPFS. [GitHub](https://github.com/fazo96/ipfs-drive) -* [ipfs.ink](https://ipfs.ink) - Publish and render markdown essays to and from ipfs. [GitHub](https://github.com/kpcyrd/ipfs.ink) -* [ipfs-search](http://ipfs-search.com) - Search engine for files and directories on IPFS. -* [ipfs-share](https://github.com/rameshvarun/ipfs-share) - Pastebin/Image host/File sharing application -* [ipfs.pics](https://github.com/ipfspics/ipfspics-server) - Upload and share pics. -* [IPFSBin](https://github.com/victorbjelkholm/ipfsbin) - Pastebin clone build. -* [IPFSStore](https://ipfsstore.it) - Pinning paid with Bitcoin -* [markup.rocks](https://github.com/davidar/markup.rocks) - Pandoc-based markup editor/previewer/converter, ported to IPFS. [Example](https://ipfs.io/ipfs/QmWPgJnUGLB1LPh9KMG9LEN4LVu5e17TwkEtcmTWdNn9V6/#/ipfs/QmfQ75DjAxYzxMP2hdm6o4wFwZS5t7uorEZ2pX9AKXEg2u) -* [NodeFort.io](https://www.nodefort.io) - Web-based IPFS node hosting service. -* [Orbit](https://github.com/haadcode/orbit) - Distributed, peer-to-peer chat application on IPFS. -* [Origin Protocol](https://demo.originprotocol.com/) - Distributed sharing economy marketplace with images, metadata, and ERC 725 data stored on IPFS. ([Gateway](https://ipfs.io/ipfs/QmWP28bNAJbkiKrXHAHzotKCvLyNragErycSYQQR9KiFby/#/)) [Github](https://github.com/OriginProtocol/demo-dapp) -* [Partyshare](https://partysha.re) - A simple file sharing app. -* [Philes](https://github.com/chrismatthieu/philes) - A simple browser-based IPFS notepad app. -* [Pathephone](https://pathephone.github.io) - Distributed music streaming app. -* [Filemap](https://filemap.xyz/) - Upload files to a geographic point and never memorize a link again. -* [FileNation](https://filenation.io/) - The simplest way to send your files around the world using IPFS. -* [Playback](https://mafintosh.github.io/playback/) - IPFS playback support. This allows casting a video in IPFS to a Chromecast. -* [PushToTalk](http://timothy.hobbs.cz/push-to-talk/index.html) - Push to Talk lets you edit audio essays and publish them with IPFS. -* [ujo](http://ujomusic.com/) - A blockchain marketplace for musicians. -* [uport](https://uport.me/#home) - Uport is a mobile, self-sovereign identity and key management system, built on the Ethereum blockchain. -* [gogo.tattoo](http://gogo.tattoo) - Gogo Tattoo Project uses IPFS, DLTs and other modern technologies to offer tattoo artists and wearers an unbreakable lifetime record of their portfolios. gogo.tattoo app already has a feature to share works directly to IPFS. -* [OpenBazaar](https://www.openbazaar.org/) - This new version(v2.0) is built on IPFS, Openbazaar stores can now be accessible to buyers even when they are offline. -* [ipfs-md-wiki](https://github.com/daijiale/ipfs-md-wiki) - Build your wiki system base on ipfs and markdown. -* [infura.io](https://infura.io) - A Infrastructure: use API and developer tools provide secure, reliable, and scalable access to Ethereum and IPFS to help build decentralized application easier. -* [Temporal](https://github.com/RTradeLtd/Temporal) - Temporal is an easy to use API and platform for integrating IPFS and other distributed/decentralized storage technologies into enterprise applications -* [Textile Photos](https://www.textile.photos) - Textile Photos is a secure, mobile digital wallet for your photos. [GitHub](https://github.com/textileio/textile-mobile) - -### Single page Webapps - -These are narrowly-scoped, little JS "apps" deployed through IPFS. - -- [a markdown renderer](https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/markdown-viewer) - [example]( - https://ipfs.io/ipfs/QmSrCRJmzE4zE1nAfWPbzVfanKQNBhp7ZWmMnEdbiLvYNh/mdown#/ipfs/QmfQ75DjAxYzxMP2hdm6o4wFwZS5t7uorEZ2pX9AKXEg2u -) -- [a js video player](https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/play) - [example]( - https://ipfs.io/ipfs/QmVc6zuAneKJzicnJpfrqCH9gSy6bz54JhcypfJYhGUFQu/play#/ipfs/QmTKZgRNwDNZwHtJSjCp6r5FYefzpULfy37JvMt9DwvXse -) -- [a qr-code renderer](https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/qr-render) - [example]( - https://ipfs.io/ipfs/QmccqhJg5wm5kNjAP4k4HrYxoqaXUGNuotDUqfvYBx8jrR/qr#enter%20text%20here -) -- [IPFessay](https://gitlab.com/stavros/IPFessay) - A simple way to publish uncensorable essays on IPFS. +- [a js video player](https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/play) - [Demo](https://ipfs.io/ipfs/QmVc6zuAneKJzicnJpfrqCH9gSy6bz54JhcypfJYhGUFQu/play#/ipfs/QmTKZgRNwDNZwHtJSjCp6r5FYefzpULfy37JvMt9DwvXs) +- [a markdown renderer](https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/markdown-viewer) - [Demo](https://ipfs.io/ipfs/QmSrCRJmzE4zE1nAfWPbzVfanKQNBhp7ZWmMnEdbiLvYNh/mdown#/ipfs/QmfQ75DjAxYzxMP2hdm6o4wFwZS5t7uorEZ2pX9AKXEg2u) +- [a qr-code renderer](https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/qr-render) - [Demo](https://ipfs.io/ipfs/QmccqhJg5wm5kNjAP4k4HrYxoqaXUGNuotDUqfvYBx8jrR/qr#enter%20text%20here) +- [akasha](http://akasha.world/) - A Next-Generation Social Media Network, powered by Ethereum and embedded into IPFS. +- [Alexandria](http://www.alexandria.io/learn/#integrated-technologies) - Decentralized content publishing / monetization platform. +- [Arbore](http://arbo.re) - A friend-to-friend file-sharing app build on top of IPFS. +- [Arpadyne](https://arpadyne.computes.com) - The New Internet - DNS powered by OrbitDB. Content delivered via IPFS. +- [beets](https://github.com/beetbox/beets) - Beets has a plugin which allows for easy sharing of music libraries using IPFS +- [Blokaly](https://github.com/blokaly) - A badge issuing, sharing and display platform based on IPFS. +- [Boards](https://ipfs.io/ipns/boards.ydns.eu) - Distributed social platform that runs in the browser. [Source](https://github.com/fazo96/ipfs-boards) +- [Cohort](https://github.com/zignig/cohort) - A golang app to preset a threejs interface and get all of its assets out of IPFS. +- [Computes](https://computes.io) - Computes.io is a distributed supercomputer powered by IPFS. +- [dapple](https://github.com/nexusdev/dapple) - Dapple is a Solidity developer multitool designed to manage the growing complexity of interconnected smart contract systems. +- [digx](https://www.dgx.io/) - Digix is an asset-tokenisation platform built on Ethereum and IPFS. +- [dtube](https://d.tube) - Distributed video sharing with steem.it intergrations, using ipfs for backend storage. +- [Ethlance](http://ethlance.com) - First completely decentralised job market platform built on Ethereum and IPFS. [Source](https://github.com/madvas/ethlance) +- [Filemap](https://filemap.xyz/) - Upload files to a geographic point and never memorize a link again. +- [FileNation](https://filenation.io/) - The simplest way to send your files around the world using IPFS. +- [git-ipfs-rehost](https://github.com/whyrusleeping/git-ipfs-rehost) - A script to rehost your git repos in ipfs. +- [Global Upload](https://globalupload.io/) - File transportation service for IPFS, upload files to the future of distributed web. +- [gogo.tattoo](http://gogo.tattoo) - Gogo Tattoo Project uses IPFS, DLTs and other modern technologies to offer tattoo artists and wearers an unbreakable lifetime record of their portfolios. gogo.tattoo app already has a feature to share works directly to IPFS. +- [Gorilla REPL viewer](https://github.com/keorn/ipfs-gorilla-repl) - Gorilla is a rich REPL for Clojure in the notebook style. [Demo](https://ipfs.io/ipfs/QmRNUauWDvZFkAp1Bw3kAode3jT8aH2vx7LYzbS7H6R3Mg/view.html?path=/ipfs/QmbRdyLXiFWrKc5hW1NbvpUxF9tLovWCPgiz4BDhjD9k3j) - [Hardbin](https://github.com/jes/hardbin) - Hardbin is an encrypted pastebin, with the decryption key passed in the URL fragment - [hasteIPFS](https://ipfs.io/ipns/bin.ipfs.ovh/) - IPFS based code bin. (Read only for now) -- [Gorilla REPL viewer](https://github.com/keorn/ipfs-gorilla-repl) - [example](https://ipfs.io/ipfs/QmRNUauWDvZFkAp1Bw3kAode3jT8aH2vx7LYzbS7H6R3Mg/view.html?path=/ipfs/QmbRdyLXiFWrKc5hW1NbvpUxF9tLovWCPgiz4BDhjD9k3j) +- [HydrusNetwork](https://github.com/hydrusnetwork/hydrus) - A booru-style media tagging application with a multitude of features, recently added basic ipfs support. +- [infura.io](https://infura.io) - A Infrastructure: use API and developer tools provide secure, reliable, and scalable access toEthereum and IPFS to help build decentralized application easier. +- [InterPlanetary Wayback](https://github.com/oduwsdl/ipwb) - Web Archive (WARC) indexing and replay using IPFS. +- [Interplanetary Wiki](https://github.com/jamescarlyle/ipfs-wiki) - Wiki built on top of IPFS +- [IPFessay](https://gitlab.com/stavros/IPFessay) - A simple way to publish uncensorable essays on IPFS. +- [IPFS Drive](http://ipfs-drive.ydns.eu) - In browser file manager for IPFS. [Source](https://github.com/fazo96/ipfs-drive) +- [IPFS Event Drop](https://github.com/travisperson/ipfs-event-drops) - An app that allows for improved visualization of ipfs events. +- [ipfs-md-wiki](https://github.com/daijiale/ipfs-md-wiki) - Build your wiki system base on ipfs and markdown. +- [ipfs-search](http://ipfs-search.com) - Search engine for files and directories on IPFS. +- [ipfs-share](https://github.com/rameshvarun/ipfs-share) - Pastebin/Image host/File sharing application +- [ipfs.ink](https://ipfs.ink) - Publish and render markdown essays to and from ipfs. [Source](https://github.com/kpcyrd/ipfs.ink) +- [ipfs.pics](https://github.com/ipfspics/ipfspics-server) - Upload and share pics. +- [IPFSBin](https://github.com/victorbjelkholm/ipfsbin) - Pastebin clone build. +- [IPFSStore](https://ipfsstore.it) - Pinning paid with Bitcoin +- [markup.rocks](https://ipfs.io/ipfs/QmWPgJnUGLB1LPh9KMG9LEN4LVu5e17TwkEtcmTWdNn9V6/#/ipfs/QmfQ75DjAxYzxMP2hdm6o4wFwZS5t7uorEZ2pX9AKXEg2u) - Pandoc-based markup editor/previewer/converter, ported to IPFS. [Source](https://github.com/davidar/markup.rocks) +- [NodeFort.io](https://www.nodefort.io) - Web-based IPFS node hosting service. +- [OpenBazaar](https://www.openbazaar.org/) - This new version(v2.0) is built on IPFS, Openbazaar stores can now be accessible to buyers even when they are offline. +- [Orbit](https://orbit.chat) - Distributed, peer-to-peer chat application on IPFS. [Source](https://github.com/haadcode/orbit) +- [Origin Protocol](https://demo.originprotocol.com/) - Distributed sharing economy marketplace with images, metadata, and ERC 725 data stored on IPFS. [Source](https://github.com/OriginProtocol/demo-dapp) +- [Partyshare](https://partysha.re) - A simple file sharing app. +- [Pathephone](https://pathephone.github.io) - Distributed music streaming app. +- [Philes](https://philes.co) - A simple browser-based IPFS notepad app. [Source](https://github.com/chrismatthieu/philes) +- [Playback](https://mafintosh.github.io/playback/) - IPFS playback support. This allows casting a video in IPFS to a Chromecast. +- [PushToTalk](http://timothy.hobbs.cz/push-to-talk/index.html) - Push to Talk lets you edit audio essays and publish them with IPFS. +- [Temporal](https://github.com/RTradeLtd/Temporal) - Temporal is an easy to use API and platform for integrating IPFS and other distributed/decentralized storage technologies into enterprise applications +- [Textile Photos](https://www.textile.photos) - Textile Photos is a secure, mobile digital wallet for your photos. [Source](https://github.com/textileio/textile-mobile) +- [ujo](http://ujomusic.com/) - A blockchain marketplace for musicians. +- [uport](https://uport.me/#home) - Uport is a mobile, self-sovereign identity and key management system, built on the Ethereum blockchain. + +## Articles + +- 2018-07-11: [On future-proof cryptographic hashes](https://pascalprecht.github.io/posts/future-proofed-hashes-with-multihash/) +- 2017-06-13: [Decentralized & Distributed Edge Computing Comes to Computes.io](https://blog.computes.io/decentralized-distributed-edge-computing-comes-to-computes-io-396aa062bc85) +- [Downloading nodejs versions with nvm/n over IPFS](https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmUx363UFtgiQqkHHsPK3TSDmwoALDo2hrbMWbcxjH2vFc) +- 2017-03-31: [Using IPFS for IoT Communications](https://medium.com/@chrismatthieu/using-ipfs-for-iot-communications-b49c2139783a) +- 2016-09-12: [IPFS: The Internet Democratised](https://medium.com/@tonywillenberg/web-3-0-a-truly-democratised-internet-f4b06cb4077b) +- 2016-05-20: [Changelog Podcast](https://changelog.com/204/) +- 2015-11-01: [Eris + IPFS](https://monax.io/2015/11/01/eris-and-ipfs/) +- 2015-09-18: [The InterPlanetary File System Wants to Create a Permanent Web](http://motherboard.vice.com/read/the-interplanetary-file-system-wants-to-create-a-permanent-web) +- 2015-09-13: [Introduction to IPFS](http://whatdoesthequantsay.com/2015/09/13/ipfs-introduction-by-example) +- 2015-09-10: [First Steps Toward Implementing Distributed Permanent Web With IPFS](https://hacked.com/first-steps-toward-implementing-distributed-permanent-web-ipfs/) +- 2015-09-08: [HTTP is obsolete. It's time for the distributed, permanent web](https://ipfs.io/ipfs/QmNhFJjGcMPqpuYfxL62VVB9528NXqDNMFXiqN5bgFYiZ1/its-time-for-the-permanent-web.html) ## Tools -* [Blockwatch](https://ipfs.io/ipfs/QmdikpwcyeBuGaVzWzSzPuqvBfTGD8jPAVydcCjYHsBUxo/index.html) - Monitor the current block number of the Ethereum blockchain, and set alerts (stored locally using PouchDB in your browser) for when certain block heights are passed. ([github](https://github.com/MidnightLightning/ethereum-blockwatch)) -* [cachewarmer](https://github.com/BrendanBenshoof/cachewarmer) - Donate ipfs gateways to cache other people's content -* [git-remote-ipfs](https://github.com/cryptix/git-remote-ipfs) - push/pull repositories from/to IPFS -* [http2ipfs](https://github.com/jbenet/http2ipfs-web) - This is a simple webtool to add URLs to an IPFS node. -* [ipcat](https://github.com/noffle/ipcat) - :cat2: Retrieve IPFS object data and send it to stdout. -* [ipfs-chrome-station](https://github.com/fbaiodias/ipfs-chrome-station) - Chrome extension to redirect ipfs.io traffic to local gateway -* [ipfs-chrome-extension](https://github.com/dylanPowers/ipfs-chrome-extension) - Chrome extension to redirect ipfs.io traffic to local gateway -* [ipfs-companion](https://github.com/ipfs/ipfs-companion) - Firefox addon to provide access to IPFS via local gateway -* [ipfs-gui](https://github.com/marcin212/ipfs-gui) - Windows UI integration and IPFS installer -* [ipfs-linux-service](https://github.com/dylanPowers/ipfs-linux-service) - IPFS Linux Init Daemon -* [ipfs-paste](https://github.com/jbenet/ipfs-paste) - Paste stdin and clipboard to IPFS -* [ipfs-screencap](https://github.com/jbenet/ipfs-screencap) - Capture screenshots, publish them to IPFS, and copy the link to the clipboard. -* [ipfscrape](https://github.com/victorbjelkholm/ipfscrape) - Scrape a webpage with all assets and put it in IPFS -* [ipfsecret](https://github.com/c2fo-lab/ipfsecret) - Encrypt and decrypt IPFS files with a secret passphrase -* [ipget](https://github.com/ipfs/ipget) - :satellite: wget for IPFS: retrieve files over IPFS and save them locally. -* [IPRedirect](https://github.com/JayBrown/IPRedirect) - Browser userscript for redirecting IPFS/IPNS addresses to your local gateway. This should work on any browser that hasn’t had an extension written for it yet and has support for userscripts. -* [ipscend](https://github.com/diasdavid/ipscend) - Tool for hosting web apps and static websites in IPFS -* [Orion](https://github.com/Siderus/Orion) - KISS, Easy to setup and use IPFS node for macOS, Windows and Linux. -* [pinbot](https://github.com/whyrusleeping/pinbot) - Pin content via IRC -* [ipfs-mount](https://github.com/richardschneider/net-ipfs-mount) - Mount IPFS as a mapped drive on Windows -* [ipfs-add-from-url](https://github.com/maxlath/ipfs-add-from-url) - Add a file to IPFS from a URL instead of a file path -* [ipfs-add-from-encrypted](https://github.com/TroyWilson1/ipfs-add-from-encrypted) - Encrypt a file or directory with AES256 then add to IPFS +- [Blockwatch](https://ipfs.io/ipfs/QmdikpwcyeBuGaVzWzSzPuqvBfTGD8jPAVydcCjYHsBUxo/index.html) - Monitor the current block number of the Ethereum blockchain, and set alerts (stored locally using PouchDB in your browser) for when certain block heights are passed. [Source](https://github.com/MidnightLightning/ethereum-blockwatch) +- [cachewarmer](https://github.com/BrendanBenshoof/cachewarmer) - Donate ipfs gateways to cache other people's content +- [git-remote-ipfs](https://github.com/cryptix/git-remote-ipfs) - push/pull repositories from/to IPFS +- [http2ipfs](https://github.com/jbenet/http2ipfs-web) - This is a simple webtool to add URLs to an IPFS node. +- [ipcat](https://github.com/noffle/ipcat) - :cat2: Retrieve IPFS object data and send it to stdout. +- [ipfs-add-from-encrypted](https://github.com/TroyWilson1/ipfs-add-from-encrypted) - Encrypt a file or directory with AES256 then add to IPFS +- [ipfs-add-from-url](https://github.com/maxlath/ipfs-add-from-url) - Add a file to IPFS from a URL instead of a file path +- [ipfs-chrome-extension](https://github.com/dylanPowers/ipfs-chrome-extension) - Chrome extension to redirect ipfs.io traffic to local gateway +- [ipfs-chrome-station](https://github.com/fbaiodias/ipfs-chrome-station) - Chrome extension to redirect ipfs.io traffic to local gateway +- [ipfs-companion](https://github.com/ipfs/ipfs-companion) - Browser extension that simplifies access to IPFS resources. +- [ipfs-gui](https://github.com/marcin212/ipfs-gui) - Windows UI integration and IPFS installer +- [ipfs-gui](https://github.com/marcin212/ipfs-gui) - Windows UI integration and IPFS installer +- [ipfs-linux-service](https://github.com/dylanPowers/ipfs-linux-service) - IPFS Linux Init Daemon +- [ipfs-linux-service](https://github.com/dylanPowers/ipfs-linux-service) - IPFS Linux Init Daemon +- [ipfs-mount](https://github.com/richardschneider/net-ipfs-mount) - Mount IPFS as a mapped drive on Windows +- [ipfs-paste](https://github.com/jbenet/ipfs-paste) - Paste stdin and clipboard to IPFS +- [ipfs-screencap](https://github.com/jbenet/ipfs-screencap) - Capture screenshots, publish them to IPFS, and copy the link to the clipboard. +- [ipfscrape](https://github.com/victorbjelkholm/ipfscrape) - Scrape a webpage with all assets and put it in IPFS +- [ipfsecret](https://github.com/c2fo-lab/ipfsecret) - Encrypt and decrypt IPFS files with a secret passphrase +- [ipget](https://github.com/ipfs/ipget) - :satellite: wget for IPFS: retrieve files over IPFS and save them locally. +- [IPRedirect](https://github.com/JayBrown/IPRedirect) - Browser userscript for redirecting IPFS/IPNS addresses to your local gateway. This should work on any browser that hasn't had an extension written for it yet and has support for userscripts. +- [ipscend](https://github.com/diasdavid/ipscend) - Tool for hosting web apps and static websites in IPFS +- [Orion](https://github.com/Siderus/Orion) - KISS, Easy to setup and use IPFS node for macOS, Windows and Linux. +- [pinbot](https://github.com/whyrusleeping/pinbot) - Pin content via IRC ## Videos -* [IPFS Alpha - Why we must redistribute the web](https://www.youtube.com/watch?v=skMTdSEaCtA) (YouTube) -* [Juan Benet at Stanford 2015](https://www.youtube.com/watch?v=HUVmypx9HGI) (YouTube) -* [Juan Benet at Fullstack Fest 2016](https://www.youtube.com/watch?v=jONZtXMu03w) (YouTube) ([IPFS Mirror](https://ipfs.io/ipfs/QmX8LDhDSYdX3xG6cHFUybXLDSuvo9Lz6wF5NU3UVmJRnB)) - -## Archives - -## Articles and Press - -* 2018-07-11: [On future-proof cryptographic hashes](https://pascalprecht.github.io/posts/future-proofed-hashes-with-multihash/) (pascalprecht.github.io) -* 2017-06-13: [Decentralized & Distributed Edge Computing Comes to Computes.io](https://blog.computes.io/decentralized-distributed-edge-computing-comes-to-computes-io-396aa062bc85) (medium.com) -* 2017-03-31: [Using IPFS for IoT Communications](https://medium.com/@chrismatthieu/using-ipfs-for-iot-communications-b49c2139783a) (medium.com) -* 2016-09-12: [IPFS: The Internet Democratised](https://medium.com/@tonywillenberg/web-3-0-a-truly-democratised-internet-f4b06cb4077b) (medium.com) -* 2016-05-20: [Changelog Podcast](https://changelog.com/204/) (changelog.com) -* 2015-09-10: [First Steps Toward Implementing Distributed Permanent Web With IPFS](https://hacked.com/first-steps-toward-implementing-distributed-permanent-web-ipfs/) (Hacked.com) -* 2015-09-13: [Introduction to IPFS](http://whatdoesthequantsay.com/2015/09/13/ipfs-introduction-by-example) (whatdoesthequantsay.com) -* 2015-09-18: [The InterPlanetary File System Wants to Create a Permanent Web](http://motherboard.vice.com/read/the-interplanetary-file-system-wants-to-create-a-permanent-web) (Vice // Motherboard) -* 2015-11-01: [Eris + IPFS](https://monax.io/2015/11/01/eris-and-ipfs/) (archived at monax.io) - -### Articles independently hosted on IPFS -* 2015-09-08: [HTTP is obsolete. It's time for the distributed, permanent web](https://ipfs.io/ipfs/QmNhFJjGcMPqpuYfxL62VVB9528NXqDNMFXiqN5bgFYiZ1/its-time-for-the-permanent-web.html) -* [Downloading nodejs versions with nvm/n over IPFS](https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmUx363UFtgiQqkHHsPK3TSDmwoALDo2hrbMWbcxjH2vFc) (ipfs.io) +- [IPFS Alpha - Why we must redistribute the web](https://www.youtube.com/watch?v=skMTdSEaCtA) +- [Juan Benet at Fullstack Fest 2016](https://www.youtube.com/watch?v=jONZtXMu03w) +- [Juan Benet at Stanford 2015](https://www.youtube.com/watch?v=HUVmypx9HGI) ## Discussions diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile new file mode 100644 index 00000000..4d7c2849 --- /dev/null +++ b/ci/Jenkinsfile @@ -0,0 +1,5 @@ +website([ + website: 'awesome.ipfs.io', + disable_publish: true, + record: '_dnslink.dev' +]) diff --git a/data/apps.yaml b/data/apps.yaml new file mode 100644 index 00000000..2a0bb99c --- /dev/null +++ b/data/apps.yaml @@ -0,0 +1,237 @@ +title: Apps +color: aqua +icon: stroke_marketing +description: Applications built with IPFS or with functionality that uses IPFS. +content: + - title: akasha + website: http://akasha.world/ + description: > + A Next-Generation Social Media Network, powered by Ethereum and embedded + into IPFS. + - title: Alexandria + website: http://www.alexandria.io/learn/#integrated-technologies + description: > + Decentralized content publishing / monetization platform. + - title: Arbore + website: http://arbo.re + description: > + A friend-to-friend file-sharing app build on top of IPFS. + - title: beets + source: https://github.com/beetbox/beets + description: > + Beets has a plugin which allows for easy sharing of music libraries + using IPFS + - title: Blokaly + source: https://github.com/blokaly + description: > + A badge issuing, sharing and display platform based on IPFS. + - title: Boards + website: https://ipfs.io/ipns/boards.ydns.eu + source: https://github.com/fazo96/ipfs-boards + description: > + Distributed social platform that runs in the browser. + - title: Cohort + source: https://github.com/zignig/cohort + description: > + A golang app to preset a threejs interface and get all of its assets + out of IPFS. + - title: Computes + website: https://computes.io + picture: /images/computes.svg + description: > + Computes.io is a distributed supercomputer powered by IPFS. + - title: dapple + source: https://github.com/nexusdev/dapple + description: > + Dapple is a Solidity developer multitool designed to manage the growing + complexity of interconnected smart contract systems. + - title: digx + website: https://www.dgx.io/ + description: > + Digix is an asset-tokenisation platform built on Ethereum and IPFS. + - title: dtube + website: https://d.tube + picture: /images/dtube.png + description: > + Distributed video sharing with steem.it intergrations, using ipfs for + backend storage. + - title: Ethlance + website: http://ethlance.com + source: https://github.com/madvas/ethlance + description: > + First completely decentralised job market platform built on Ethereum + and IPFS. + - title: git-ipfs-rehost + source: https://github.com/whyrusleeping/git-ipfs-rehost + description: > + A script to rehost your git repos in ipfs. + - title: Global Upload + website: https://globalupload.io/ + description: > + File transportation service for IPFS, upload files to the future of + distributed web. + - title: HydrusNetwork + source: https://github.com/hydrusnetwork/hydrus + description: > + A booru-style media tagging application with a multitude of features, + recently added basic ipfs support. + - title: InterPlanetary Wayback + source: https://github.com/oduwsdl/ipwb + description: > + Web Archive (WARC) indexing and replay using IPFS. + - title: Interplanetary Wiki + source: https://github.com/jamescarlyle/ipfs-wiki + description: > + Wiki built on top of IPFS + - title: IPFS Event Drop + source: https://github.com/travisperson/ipfs-event-drops + description: > + An app that allows for improved visualization of ipfs events. + - title: IPFS Drive + website: http://ipfs-drive.ydns.eu + source: https://github.com/fazo96/ipfs-drive + description: > + In browser file manager for IPFS. + - title: ipfs.ink + website: https://ipfs.ink + source: https://github.com/kpcyrd/ipfs.ink + description: > + Publish and render markdown essays to and from ipfs. + - title: ipfs-search + website: http://ipfs-search.com + description: > + Search engine for files and directories on IPFS. + - title: ipfs-share + source: https://github.com/rameshvarun/ipfs-share + description: > + Pastebin/Image host/File sharing application + - title: ipfs.pics + source: https://github.com/ipfspics/ipfspics-server + description: > + Upload and share pics. + - title: IPFSBin + source: https://github.com/victorbjelkholm/ipfsbin + description: > + Pastebin clone build. + - title: IPFSStore + website: https://ipfsstore.it + description: > + Pinning paid with Bitcoin + - title: markup.rocks + website: https://ipfs.io/ipfs/QmWPgJnUGLB1LPh9KMG9LEN4LVu5e17TwkEtcmTWdNn9V6/#/ipfs/QmfQ75DjAxYzxMP2hdm6o4wFwZS5t7uorEZ2pX9AKXEg2u + source: https://github.com/davidar/markup.rocks + description: > + Pandoc-based markup editor/previewer/converter, ported to IPFS. + - title: Orbit + website: https://orbit.chat + source: https://github.com/haadcode/orbit + picture: /images/orbit.png + description: > + Distributed, peer-to-peer chat application on IPFS. + - title: Partyshare + website: https://partysha.re + description: > + A simple file sharing app. + - title: Filemap + website: https://filemap.xyz/ + description: > + Upload files to a geographic point and never memorize a link again. + - title: FileNation + website: https://filenation.io/ + description: > + The simplest way to send your files around the world using IPFS. + - title: Playback + source: https://mafintosh.github.io/playback/ + description: > + IPFS playback support. This allows casting a video in IPFS to a Chromecast. + - title: PushToTalk + website: http://timothy.hobbs.cz/push-to-talk/index.html + description: > + Push to Talk lets you edit audio essays and publish them with IPFS. + - title: ujo + website: http://ujomusic.com/ + description: > + A blockchain marketplace for musicians. + - title: uport + website: https://uport.me/#home + description: > + Uport is a mobile, self-sovereign identity and key management system, + built on the Ethereum blockchain. + - title: gogo.tattoo + website: http://gogo.tattoo + description: > + Gogo Tattoo Project uses IPFS, DLTs and other modern technologies to + offer tattoo artists and wearers an unbreakable lifetime record of their portfolios. + gogo.tattoo app already has a feature to share works directly to IPFS. + - title: IPFessay + website: https://gitlab.com/stavros/IPFessay + description: > + A simple way to publish uncensorable essays on IPFS. + - title: Hardbin + source: https://github.com/jes/hardbin + description: > + Hardbin is an encrypted pastebin, with the decryption key passed in + the URL fragment + - title: hasteIPFS + website: https://ipfs.io/ipns/bin.ipfs.ovh/ + description: > + IPFS based code bin. (Read only for now) + - title: Gorilla REPL viewer + source: https://github.com/keorn/ipfs-gorilla-repl + demo: https://ipfs.io/ipfs/QmRNUauWDvZFkAp1Bw3kAode3jT8aH2vx7LYzbS7H6R3Mg/view.html?path=/ipfs/QmbRdyLXiFWrKc5hW1NbvpUxF9tLovWCPgiz4BDhjD9k3j + description: > + Gorilla is a rich REPL for Clojure in the notebook style. + - title: a markdown renderer + source: https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/markdown-viewer + demo: https://ipfs.io/ipfs/QmSrCRJmzE4zE1nAfWPbzVfanKQNBhp7ZWmMnEdbiLvYNh/mdown#/ipfs/QmfQ75DjAxYzxMP2hdm6o4wFwZS5t7uorEZ2pX9AKXEg2u + - title: a js video player + source: https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/play + demo: https://ipfs.io/ipfs/QmVc6zuAneKJzicnJpfrqCH9gSy6bz54JhcypfJYhGUFQu/play#/ipfs/QmTKZgRNwDNZwHtJSjCp6r5FYefzpULfy37JvMt9DwvXs + - title: a qr-code renderer + source: https://github.com/ipfs/website/tree/master/content/docs/examples/webapps/qr-render + demo: https://ipfs.io/ipfs/QmccqhJg5wm5kNjAP4k4HrYxoqaXUGNuotDUqfvYBx8jrR/qr#enter%20text%20here + - title: Arpadyne + website: https://arpadyne.computes.com + description: > + The New Internet - DNS powered by OrbitDB. Content delivered via IPFS. + - title: Temporal + source: https://github.com/RTradeLtd/Temporal + description: > + Temporal is an easy to use API and platform for integrating IPFS and other + distributed/decentralized storage technologies into enterprise applications + - title: Textile Photos + website: https://www.textile.photos + source: https://github.com/textileio/textile-mobile + picture: /images/textilephotos.png + description: > + Textile Photos is a secure, mobile digital wallet for your photos. + - title: Pathephone + website: https://pathephone.github.io + description: Distributed music streaming app. + - title: Origin Protocol + website: https://demo.originprotocol.com/ + source: https://github.com/OriginProtocol/demo-dapp + description: > + Distributed sharing economy marketplace with images, metadata, and ERC 725 data stored on IPFS. + - title: Philes + website: https://philes.co + source: https://github.com/chrismatthieu/philes + description: A simple browser-based IPFS notepad app. + - title: ipfs-md-wiki + source: https://github.com/daijiale/ipfs-md-wiki + description: Build your wiki system base on ipfs and markdown. + - title: infura.io + website: https://infura.io + picture: /images/infura.png + description: > + A Infrastructure: use API and developer tools provide secure, reliable, and + scalable access toEthereum and IPFS to help build decentralized application easier. + - title: NodeFort.io + website: https://www.nodefort.io + picture: /images/nodefort.png + description: Web-based IPFS node hosting service. + - title: OpenBazaar + website: https://www.openbazaar.org/ + description: > + This new version(v2.0) is built on IPFS, Openbazaar stores can now be accessible + to buyers even when they are offline. diff --git a/data/articles.yaml b/data/articles.yaml new file mode 100644 index 00000000..69a31c0f --- /dev/null +++ b/data/articles.yaml @@ -0,0 +1,37 @@ +title: Articles +color: navy +icon: stroke_pencil +description: Articles about the decentralized web and IPFS. +content: + - title: Decentralized & Distributed Edge Computing Comes to Computes.io + date: '2017-06-13' + website: https://blog.computes.io/decentralized-distributed-edge-computing-comes-to-computes-io-396aa062bc85 + - title: Using IPFS for IoT Communications + date: '2017-03-31' + website: https://medium.com/@chrismatthieu/using-ipfs-for-iot-communications-b49c2139783a + - title: 'IPFS: The Internet Democratised' + date: '2016-09-12' + website: https://medium.com/@tonywillenberg/web-3-0-a-truly-democratised-internet-f4b06cb4077b + - title: Changelog Podcast + date: '2016-05-20' + website: https://changelog.com/204/ + - title: First Steps Toward Implementing Distributed Permanent Web With IPFS + date: '2015-09-10' + website: https://hacked.com/first-steps-toward-implementing-distributed-permanent-web-ipfs/ + - title: Introduction to IPFS + date: '2015-09-13' + website: http://whatdoesthequantsay.com/2015/09/13/ipfs-introduction-by-example + - title: The InterPlanetary File System Wants to Create a Permanent Web + date: '2015-09-18' + website: http://motherboard.vice.com/read/the-interplanetary-file-system-wants-to-create-a-permanent-web + - title: Eris + IPFS + date: '2015-11-01' + website: https://monax.io/2015/11/01/eris-and-ipfs/ + - title: HTTP is obsolete. It's time for the distributed, permanent web + date: '2015-09-08' + website: https://ipfs.io/ipfs/QmNhFJjGcMPqpuYfxL62VVB9528NXqDNMFXiqN5bgFYiZ1/its-time-for-the-permanent-web.html + - title: Downloading nodejs versions with nvm/n over IPFS + website: https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmUx363UFtgiQqkHHsPK3TSDmwoALDo2hrbMWbcxjH2vFc + - title: On future-proof cryptographic hashes + date: '2018-07-11' + website: https://pascalprecht.github.io/posts/future-proofed-hashes-with-multihash/ diff --git a/data/tools.yaml b/data/tools.yaml new file mode 100644 index 00000000..84568b02 --- /dev/null +++ b/data/tools.yaml @@ -0,0 +1,86 @@ +title: Tools +color: yellow +icon: stroke_code +description: Tools built on the top of IPFS. +content: +- title: cachewarmer + source: https://github.com/BrendanBenshoof/cachewarmer + description: Donate ipfs gateways to cache other people's content +- title: git-remote-ipfs + source: https://github.com/cryptix/git-remote-ipfs + description: push/pull repositories from/to IPFS +- title: http2ipfs + source: https://github.com/jbenet/http2ipfs-web + description: This is a simple webtool to add URLs to an IPFS node. +- title: ipcat + source: https://github.com/noffle/ipcat + description: ":cat2: Retrieve IPFS object data and send it to stdout." +- title: ipfs-chrome-station + source: https://github.com/fbaiodias/ipfs-chrome-station + description: Chrome extension to redirect ipfs.io traffic to local gateway +- title: ipfs-chrome-extension + source: https://github.com/dylanPowers/ipfs-chrome-extension + description: Chrome extension to redirect ipfs.io traffic to local gateway +- title: ipfs-companion + source: https://github.com/ipfs/ipfs-companion + picture: /images/companion.png + description: Browser extension that simplifies access to IPFS resources. +- title: ipfs-gui + source: https://github.com/marcin212/ipfs-gui + description: Windows UI integration and IPFS installer +- title: ipfs-linux-service + source: https://github.com/dylanPowers/ipfs-linux-service + description: IPFS Linux Init Daemon +- title: ipfs-paste + source: https://github.com/jbenet/ipfs-paste + description: Paste stdin and clipboard to IPFS +- title: ipfs-screencap + source: https://github.com/jbenet/ipfs-screencap + description: Capture screenshots, publish them to IPFS, and copy the link to the + clipboard. +- title: ipfscrape + source: https://github.com/victorbjelkholm/ipfscrape + description: Scrape a webpage with all assets and put it in IPFS +- title: ipget + source: https://github.com/ipfs/ipget + description: ":satellite: wget for IPFS: retrieve files over IPFS and save them + locally." +- title: IPRedirect + source: https://github.com/JayBrown/IPRedirect + description: Browser userscript for redirecting IPFS/IPNS addresses to your local + gateway. This should work on any browser that hasn't had an extension written + for it yet and has support for userscripts. +- title: ipscend + source: https://github.com/diasdavid/ipscend + description: Tool for hosting web apps and static websites in IPFS +- title: pinbot + source: https://github.com/whyrusleeping/pinbot + description: Pin content via IRC +- title: ipfs-mount + source: https://github.com/richardschneider/net-ipfs-mount + description: Mount IPFS as a mapped drive on Windows +- title: ipfs-add-from-url + source: https://github.com/maxlath/ipfs-add-from-url + description: Add a file to IPFS from a URL instead of a file path +- title: ipfs-gui + source: https://github.com/marcin212/ipfs-gui + description: Windows UI integration and IPFS installer +- title: ipfs-linux-service + source: https://github.com/dylanPowers/ipfs-linux-service + description: IPFS Linux Init Daemon +- title: Orion + picture: /images/orion.png + source: https://github.com/Siderus/Orion + description: KISS, Easy to setup and use IPFS node for macOS, Windows and Linux. +- title: ipfsecret + source: https://github.com/c2fo-lab/ipfsecret + description: Encrypt and decrypt IPFS files with a secret passphrase +- title: ipfs-add-from-encrypted + source: https://github.com/TroyWilson1/ipfs-add-from-encrypted + description: Encrypt a file or directory with AES256 then add to IPFS +- title: Blockwatch + website: https://ipfs.io/ipfs/QmdikpwcyeBuGaVzWzSzPuqvBfTGD8jPAVydcCjYHsBUxo/index.html + source: https://github.com/MidnightLightning/ethereum-blockwatch + description: > + Monitor the current block number of the Ethereum blockchain, and set alerts (stored locally using + PouchDB in your browser) for when certain block heights are passed. diff --git a/data/videos.yaml b/data/videos.yaml new file mode 100644 index 00000000..5c81aad3 --- /dev/null +++ b/data/videos.yaml @@ -0,0 +1,11 @@ +title: Videos +color: red +description: Videos about IPFS. +icon: stroke_speaker +content: + - title: IPFS Alpha - Why we must redistribute the web + website: https://www.youtube.com/watch?v=skMTdSEaCtA + - title: Juan Benet at Stanford 2015 + website: https://www.youtube.com/watch?v=HUVmypx9HGI + - title: Juan Benet at Fullstack Fest 2016 + website: https://www.youtube.com/watch?v=jONZtXMu03w diff --git a/migrate-to-hugo.md b/migrate-to-hugo.md new file mode 100644 index 00000000..d0efe354 --- /dev/null +++ b/migrate-to-hugo.md @@ -0,0 +1,88 @@ +## Website Elements + +- Title +- Description +- Tabs that switches between categories + - Apps + - Tools (difference from apps?) + - Archives + - Videos + - Articles + - Discussions +- Below, after clicking category, show most popular tag within that category + and allow further filtering. (future allow multiple tags? Will be hard without JS) + - topic:blockchain + - topic:ethereum + - topic:research + - topic:file-sharing + - topic:chat + - state:prototype + - state:beta + - state:stable + - platform:firefox + - platform:chrome + - platform:windows +- List of items matching the selected filters ("apps" + "topic:chat" shows all chat apps) +- Each item gets a card + - layout can be X amount of cards depending on screen width + - each card has: + - title + - screenshot of item in action + - first 80 characters of description + - highlighted and on the top if `featured` + - the title+description are normal anchor tags + - Edit link for linking to the data file (and possibly row) in Github + for easy editing +- Link to repository +- Link to issue/markdown file describing how to suggest new items +- Link to `Ecosystem` category on discuss.ipfs.io + +## Data Structure + +- Each category has it's own data file within `data/` +- Title for each item has to be unique (category should not be in URL) +- Screenshot location is based on title. If no screenshot found, should use a default image + +Example `apps.yml` + +``` +title: 'Apps' +description: 'Applications built with IPFS or with functionality that uses IPFS' +items: + - title: Akasha + description: A Next-Generation Social Media Network, powered by Ethereum and embedded into IPFS + featured: true + url: https://akasha.world/ + - title: Alexandria + description: Decentralized content publishing / monetization platform + url: http://www.alexandria.io/learn/#integrated-technologies + # `featured` defaults to false +``` + +Example `videos.yml` + +``` +title: 'Videos' +description: 'Videos about IPFS' +items: + - title: IPFS Alpha | Why We Must Distribute The Web + url: https://www.youtube.com/watch?v=skMTdSEaCtA + featured: true + - title: Juan Benet at Stanford 2015 + url: https://www.youtube.com/watch?v=HUVmypx9HGI + # `featured` defaults to false +``` + +## Readme generation + +The guide for developing/building the website should not be in `readme.md` but +rather in `develop.md` or similar, since `readme.md` will be generated by hugo +on build time. Basically it should create the same we have now, based on items +inside `data/` + +## Sorting / Ordering / Ranking + +We will have a `featured` flag which will put those items at the top. + +However, we need to ensure that Hugo sorts the same way always and might want +some other metrics for ranking, like the `state` of the project or similar. \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 00000000..4de646d0 --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "awesome-ipfs", + "version": "1.0.0", + "private": true, + "dependencies": { + "ipfs-css": "^0.5.2", + "lunr": "^2.3.0", + "tachyons": "^4.10.0" + }, + "scripts": { + "start": "node ./scripts/dev.js", + "lint": "standard", + "deploy": "npm run build && ipfs add -r -Q ./public", + "build": "run-s build:*", + "build:readme": "node ./scripts/make-readme.js", + "build:fonts": "shx mkdir -p src/static/fonts && shx cp node_modules/ipfs-css/fonts/* src/static/fonts", + "build:icons": "shx cp node_modules/ipfs-css/icons/* src/layouts/partials/icons", + "build:css": "postcss --no-map --use postcss-import cssnano -o src/static/app.css src/css/*.css", + "build:js": "browserify -g uglifyify src/js/app.js -o src/static/app.js", + "build:data": "node ./scripts/make-data.js", + "build:hugo": "hugo -s src -d ../public --cleanDestinationDir", + "build:minify": "html-minifier --input-dir=./public --output-dir=./public --file-ext=html --collapse-whitespace --remove-comments" + }, + "devDependencies": { + "babel-eslint": "^8.2.6", + "browserify": "^16.2.2", + "chokidar": "^2.0.4", + "cssnano": "^4.0.1", + "ecstatic": "^3.2.1", + "fs-extra": "^6.0.1", + "html-minifier": "^3.5.19", + "hugo-bin": "^0.29.0", + "node-yaml": "^3.1.1", + "npm-run-all": "^4.1.3", + "postcss-cli": "^5.0.1", + "postcss-import": "^11.1.0", + "shx": "^0.3.2", + "standard": "^11.0.1", + "uglifyify": "^5.0.1", + "watch": "^1.0.2" + }, + "standard": { + "parser": "babel-eslint" + }, + "author": "Protocol Labs, Inc.", + "license": "MIT", + "homepage": "." +} diff --git a/scripts/data.js b/scripts/data.js new file mode 100644 index 00000000..6b6932da --- /dev/null +++ b/scripts/data.js @@ -0,0 +1,23 @@ +const fs = require('fs') +const path = require('path') +const yaml = require('node-yaml') +const { sortAbc } = require('./utils') +const dataDir = path.join(__dirname, '../data') + +const trimIfExists = (str) => str ? str.trim() : undefined + +const files = fs.readdirSync(dataDir) + .map(file => path.join(dataDir, file)) + .map(file => yaml.readSync(file)) + .map(file => { + file.content = file.content.map(({ title, description, ...file }) => ({ + title: trimIfExists(title), + description: trimIfExists(description), + ...file + })) + + return file + }) + .sort((a, b) => sortAbc(a.title, b.title)) + +module.exports = files diff --git a/scripts/dev.js b/scripts/dev.js new file mode 100644 index 00000000..0358e650 --- /dev/null +++ b/scripts/dev.js @@ -0,0 +1,71 @@ +const chokidar = require('chokidar') +const path = require('path') +const runAll = require('npm-run-all') +const dataFolder = path.join(__dirname, '../data') +const srcFolder = path.join(__dirname, '../src') +const cssPath = path.join(__dirname, '../src/css') +const jsPath = path.join(__dirname, '../src/js') +const http = require('http') + +const options = { + stdout: process.stdout, + stderr: process.stderr +} + +const runHugo = () => { + return runAll(['build:hugo'], options).catch(() => {}) +} + +const handler = (path) => { + if (path.startsWith(dataFolder)) { + runAll(['build:data'], options).then(runHugo) + } else if (path.startsWith(cssPath)) { + runAll(['build:css'], options).then(runHugo) + } else if (path.startsWith(jsPath)) { + runAll(['build:js'], options).then(runHugo) + } else { + runHugo() + } +} + +async function run () { + console.log('Preparing fonts, css, js and data...') + await runAll(['build:fonts', 'build:css', 'build:js', 'build:icons', 'build:data'], { + stdout: process.stdout, + stderr: process.stderr, + parallel: true + }) + + await runHugo() + + console.log('Starting server...') + + const ecstatic = require('ecstatic')({ + root: `${__dirname}/../public`, + showDir: true, + autoIndex: true + }) + + http.createServer(ecstatic).listen(8080) + + const watcher = chokidar.watch([dataFolder, srcFolder], { + ignored: (string) => string.indexOf('src/content') !== -1 || + string.indexOf('src/data') !== -1 || + string.indexOf('src/resources') !== -1 || + string.indexOf('src/layouts/partials/indexes') !== -1 || + string.indexOf('src/static/fonts') !== -1 || + string.indexOf('src/static/app.css') !== -1 || + string.indexOf('src/static/app.js') !== -1, + persistent: true, + ignoreInitial: true, + awaitWriteFinish: true + }) + + watcher + .on('ready', () => console.log('Listening on :8080')) + .on('add', handler) + .on('change', handler) + .on('unlink', handler) +} + +run() diff --git a/scripts/make-data.js b/scripts/make-data.js new file mode 100644 index 00000000..96fbefe6 --- /dev/null +++ b/scripts/make-data.js @@ -0,0 +1,130 @@ +const lunr = require('lunr') +const fs = require('fs-extra') +const path = require('path') +const { slugify, capitalize, sortAbc } = require('./utils') + +const dataDir = path.join(__dirname, '../src/data') +const contentDir = path.join(__dirname, '../src/content') +const indexesDir = path.join(__dirname, '../src/layouts/partials/indexes') + +const processDataType = (data) => { + const content = data.content.map((info, index) => { + const { website, ...more } = info + + if (data.title === 'Videos' && website.includes('youtube')) { + more.youtube = website.replace('https://www.youtube.com/watch?v=', '') + } + + return { + website: website, + categories: [data.title.toLowerCase()], + ...more + } + }) + + delete data.content + + return { + info: { ...data }, + content: content + } +} + +const writeContentFile = (data) => { + const basename = slugify(data.title) + const filename = path.join(contentDir, `${basename}.md`) + + fs.writeFileSync(filename, JSON.stringify(data)) +} + +const makeIndex = (data) => { + const indexes = { 'index': [] } + + const checkField = (field, el) => { + if (Array.isArray(el[field])) { + el[field].forEach(t => { + const key = `${field}_${t}` + + if (indexes[key]) { + indexes[key].push(el.index) + } else { + indexes[key] = [el.index] + } + }) + } + } + + data.forEach(el => { + indexes.index.push(el.index) + checkField('tags', el) + checkField('categories', el) + }) + + data = data.map(({index, title, description = '', tags = [], categories = []}) => ({ + ref: index, + data: `${title} ${description} ${tags.join(' ')} ${categories.join(' ')}` + })) + + for (const index in indexes) { + const idx = lunr(function () { + this.ref('ref') + this.field('data') + + indexes[index].map(i => data[i]).forEach(this.add.bind(this)) + }) + + const file = path.join(indexesDir, index + '.html') + const json = JSON.stringify(idx).replace(`'`, `\\'`) + + fs.writeFileSync(file, ``) + } +} + +const process = () => { + fs.ensureDirSync(dataDir) + fs.ensureDirSync(contentDir) + fs.ensureDirSync(indexesDir) + fs.emptyDirSync(dataDir) + fs.emptyDirSync(contentDir) + fs.emptyDirSync(indexesDir) + + let data = [] + let types = [] + let typesObj = {} + + require('./data') + .map(processDataType) + .forEach(({info, content}) => { + types.push(info) + data.push(content) + }) + + data = data.reduce((a, v) => a.concat(v), []) + .sort((a, b) => sortAbc(a.title, b.title)) + .map((v, i) => { v.index = i; return v }) + + data.forEach(writeContentFile) + makeIndex(data) + + types = types.map(t => { + t.title = capitalize(t.title) + return t + }).sort((a, b) => { + if (a.weight < b.weight) { + return -1 + } + + if (a.weight > b.weight) { + return 1 + } + + return 0 + }).forEach(type => { + typesObj[type.title.toLowerCase()] = type + }) + + const pt = path.join(dataDir, 'categories.json') + fs.writeFileSync(pt, JSON.stringify(typesObj)) +} + +process() diff --git a/scripts/make-readme.js b/scripts/make-readme.js new file mode 100644 index 00000000..9aae10e2 --- /dev/null +++ b/scripts/make-readme.js @@ -0,0 +1,49 @@ +const fs = require('fs') +const path = require('path') +const files = require('./data') +const readme = path.join(__dirname, '../README.md') +const template = path.join(__dirname, 'readme-template.md') +const { slugify, sortInv, sortAbc } = require('./utils') + +const toc = files.map(cat => `- [${cat.title}](#${slugify(cat.title)})`).join('\n') + +const sections = files.map(category => { + let sort = (a, b) => sortAbc(a.title, b.title) + + if (category.title === 'Articles') { + sort = (a, b) => sortInv(a.date, b.date) + } + + const content = category.content.sort(sort).map(item => { + let block = '- ' + let mainUrl = '' + + if (item.website) { + mainUrl = item.website + } else if (item.source) { + mainUrl = item.source + } else if (item.demo) { + mainUrl = item.demo + } + + if (item.date) block += item.date + ': ' + block += `[${item.title}](${mainUrl}) ` + if (item.description) block += `- ${item.description.trim()}` + if (item.demo && mainUrl !== item.demo) { + if (!item.description) block += '-' + block += ` [Demo](${item.demo})` + } + if (item.source && mainUrl !== item.source) { + block += ` [Source](${item.source})` + } + + return block + }).join('\n') + + return `## ${category.title}\n\n${content}` +}).join('\n\n') + +fs.writeFileSync(readme, fs.readFileSync(template) + .toString() + .replace('#PLACEHOLDER_TOC#', toc) + .replace('#PLACEHOLDER_CATEGORIES#', sections)) diff --git a/scripts/readme-template.md b/scripts/readme-template.md new file mode 100644 index 00000000..5d01c82a --- /dev/null +++ b/scripts/readme-template.md @@ -0,0 +1,40 @@ +# Awesome IPFS [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/sindresorhus/awesome) + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) + +> Useful resources for using [IPFS](https://ipfs.io) and building things on top of it + +_This list is for projects, tools, or pretty much any things related to IPFS that +are totally_ **awesome**_. This is for products which are already awesome - if +you have plans for cool stuff to do with IPFS, you should build it, and then +link it here. If you have an idea for an awesome thing to do with IPFS, a good +place to ask about it might be in [ipfs/apps](https://github.com/ipfs/apps) or +[ipfs/notes](https://github.com/ipfs/notes)._ + +## Table of Contents + +#PLACEHOLDER_TOC# +- [Discussions](#discussions) +- [Contribute](#contribute) + - [Want to hack on IPFS?](#want-to-hack-on-ipfs) +- [License](#license) + +#PLACEHOLDER_CATEGORIES# + +## Discussions + +* [CRDTs discussion](https://github.com/ipfs/notes/issues/23) + +## Contribute + +Please add (or remove) stuff from this list if you see anything awesome! [Open an issue](https://github.com/ipfs/awesome-ipfs/issues) or a PR. + +### Want to hack on IPFS? + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) + +## License + +[![CC0](https://licensebuttons.net/p/zero/1.0/88x31.png)](https://creativecommons.org/publicdomain/zero/1.0/) diff --git a/scripts/utils.js b/scripts/utils.js new file mode 100644 index 00000000..72bd6580 --- /dev/null +++ b/scripts/utils.js @@ -0,0 +1,31 @@ +const sort = (a, b) => { + if (a < b) return -1 + if (a > b) return 1 + return 0 +} + +const sortInv = (a, b) => -sort(a, b) + +const sortAbc = (a, b) => { + a = a.toLowerCase() + b = b.toLowerCase() + return sort(a, b) +} + +const slugify = (text) => text.toString() + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^\w-]+/g, '') + .replace(/--+/g, '-') + .replace(/^-+/, '') + .replace(/-+$/, '') + +const capitalize = (text) => `${text.charAt(0).toUpperCase()}${text.slice(1).toLowerCase()}` + +module.exports = { + sort, + sortInv, + sortAbc, + slugify, + capitalize +} diff --git a/src/config.yaml b/src/config.yaml new file mode 100644 index 00000000..add7ed2a --- /dev/null +++ b/src/config.yaml @@ -0,0 +1,14 @@ +baseurl: '' +relativeurls: true +languageCode: en +pluralizelisttitles: false +removePathAccents: true +title: Awesome IPFS + +disableKinds: + - taxonomyTerm + +params: + Description: >- + Useful resources for using IPFS and building things on top of it + image: /images/banner.png diff --git a/src/css/app.css b/src/css/app.css new file mode 100644 index 00000000..7fdd1c64 --- /dev/null +++ b/src/css/app.css @@ -0,0 +1,39 @@ +@import "../../node_modules/tachyons/css/tachyons.css"; +@import "../../node_modules/ipfs-css/ipfs.css"; + +body { + background: url('./images/starfield.png') no-repeat; + background-size: cover; + background-attachment: fixed; + overflow-y: scroll; +} + +.grow2 { + -moz-osx-font-smoothing: grayscale; + backface-visibility: hidden; + transform: translateZ(0); + transition: transform 0.25s ease-out; +} + +.grow2:active, +.grow2:hover, +.grow2:focus { + transform: scale(1.05); +} + +.focus-outline:focus { + outline: 0; + box-shadow: 0 0 0 .2rem rgba(201, 210, 215, .4); +} + +.mt-auto { + margin-top: auto; +} + +.fill-blue { + fill: #357edd; +} + +.fill-white { + fill: white; +} diff --git a/src/js/app.js b/src/js/app.js new file mode 100644 index 00000000..bd208a8d --- /dev/null +++ b/src/js/app.js @@ -0,0 +1,59 @@ +const lunr = require('lunr') +const idx = lunr.Index.load(window.idx) +const search = document.getElementById('search') + +const cards = Array.from(document.querySelectorAll('.Card')) + .sort((a, b) => { + const aId = parseInt(a.dataset.ref) + const bId = parseInt(b.dataset.ref) + + if (aId < bId) { + return -1 + } + if (aId > bId) { + return 1 + } + + return 0 + }) + +function randomizr () { + const cards = document.querySelector('.CardContainer') + for (var i = cards.children.length; i >= 0; i--) { + cards.appendChild(cards.children[Math.random() * i | 0]) + } +} + +function update (display) { + cards.forEach((c) => { + if (display.indexOf(c.dataset.ref) >= 0) { + c.classList.remove('dn') + c.classList.add('flex') + } else { + c.classList.add('dn') + c.classList.remove('flex') + } + }) +} + +randomizr() + +if (search) { + search.classList.remove('dn') + const input = search.querySelector('input') + + input.addEventListener('keyup', () => { + const search = input.value + + if (search === '') { + cards.forEach((c) => c.classList.remove('dn')) + return + } + + try { + update(idx.search(search).map(s => s.ref)) + } catch (e) { + console.log(e) + } + }) +} diff --git a/src/layouts/_default/baseof.html b/src/layouts/_default/baseof.html new file mode 100644 index 00000000..796efc0d --- /dev/null +++ b/src/layouts/_default/baseof.html @@ -0,0 +1,37 @@ + + + + {{ partial "head" . }} + + + +
+ + + {{ template "main" . }} + + +
+ + + \ No newline at end of file diff --git a/src/layouts/_default/list.html b/src/layouts/_default/list.html new file mode 100644 index 00000000..913007d5 --- /dev/null +++ b/src/layouts/_default/list.html @@ -0,0 +1,9 @@ +{{ define "main" }} + +{{- $p1 := (print .Data.Plural "_") -}} +{{- $p2 := lower .Title -}} +{{- $partial := print $p1 $p2 -}} +{{- partial "list" .Data.Pages -}} +{{- partial (print "indexes/" $partial) -}} + +{{ end }} diff --git a/src/layouts/index.html b/src/layouts/index.html new file mode 100644 index 00000000..265d3a0c --- /dev/null +++ b/src/layouts/index.html @@ -0,0 +1,7 @@ +{{ define "main" }} + +{{ partial "list" .Pages }} +{{ partial "indexes/index" }} + +{{ end }} + diff --git a/src/layouts/partials/head.html b/src/layouts/partials/head.html new file mode 100644 index 00000000..b8b1421c --- /dev/null +++ b/src/layouts/partials/head.html @@ -0,0 +1,28 @@ +{{- $title := or .Title .Site.Title -}} +{{- $description := or .Description .Site.Params.Description -}} +{{- $image := print .Site.BaseURL (or .Params.image .Site.Params.Image) -}} + + + + +{{ $title }} + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/layouts/partials/icons/code.svg b/src/layouts/partials/icons/code.svg new file mode 100644 index 00000000..4a76e2cc --- /dev/null +++ b/src/layouts/partials/icons/code.svg @@ -0,0 +1 @@ + diff --git a/src/layouts/partials/icons/flask.svg b/src/layouts/partials/icons/flask.svg new file mode 100644 index 00000000..25584e69 --- /dev/null +++ b/src/layouts/partials/icons/flask.svg @@ -0,0 +1 @@ + diff --git a/src/layouts/partials/icons/globe.svg b/src/layouts/partials/icons/globe.svg new file mode 100644 index 00000000..93288660 --- /dev/null +++ b/src/layouts/partials/icons/globe.svg @@ -0,0 +1 @@ + diff --git a/src/layouts/partials/list.html b/src/layouts/partials/list.html new file mode 100644 index 00000000..6b7717cb --- /dev/null +++ b/src/layouts/partials/list.html @@ -0,0 +1,78 @@ +{{ define "text" }} +

+ {{- . -}} +

+{{ end }} + + + +
+ {{ range (sort . "Params.index") -}} +
+ {{ $cat := index .Params.categories 0 }} + {{ $color := (index .Site.Data.categories $cat).color }} +
+ {{ humanize $cat }} +
+ +
+ + + {{- if isset .Params "date" -}} + {{ template "text" .Date.Format "January 2, 2006" }} + {{- end -}} + + {{- if isset .Params "description" -}} + {{ template "text" .Params.description }} + {{- end -}} + + {{- if isset .Params "picture" -}} +
+ +
+ {{ end }} + + {{- if isset .Params "youtube" -}} +
+ +
+ {{ end }} + +
+ {{- if isset .Params "website" -}} + + {{ partial "icons/globe.svg" }} + + {{- end -}} + + {{- if isset .Params "source" -}} + + {{ partial "icons/code.svg" }} + + {{- end -}} + + {{- if isset .Params "demo" -}} + + {{ partial "icons/flask.svg" }} + + {{- end -}} +
+
+
+ {{ end }} +
diff --git a/src/static/favicon.ico b/src/static/favicon.ico new file mode 100644 index 00000000..c0f392f2 Binary files /dev/null and b/src/static/favicon.ico differ diff --git a/src/static/images/banner.png b/src/static/images/banner.png new file mode 100644 index 00000000..d1513725 Binary files /dev/null and b/src/static/images/banner.png differ diff --git a/src/static/images/companion.png b/src/static/images/companion.png new file mode 100644 index 00000000..2d03fe19 Binary files /dev/null and b/src/static/images/companion.png differ diff --git a/src/static/images/computes.svg b/src/static/images/computes.svg new file mode 100644 index 00000000..f65f34fe --- /dev/null +++ b/src/static/images/computes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/static/images/dtube.png b/src/static/images/dtube.png new file mode 100644 index 00000000..2c9bde67 Binary files /dev/null and b/src/static/images/dtube.png differ diff --git a/src/static/images/infura.png b/src/static/images/infura.png new file mode 100644 index 00000000..d4f363ca Binary files /dev/null and b/src/static/images/infura.png differ diff --git a/src/static/images/logo.png b/src/static/images/logo.png new file mode 100644 index 00000000..0fa1909b Binary files /dev/null and b/src/static/images/logo.png differ diff --git a/src/static/images/nodefort.png b/src/static/images/nodefort.png new file mode 100644 index 00000000..376eb2dc Binary files /dev/null and b/src/static/images/nodefort.png differ diff --git a/src/static/images/orbit.png b/src/static/images/orbit.png new file mode 100644 index 00000000..42f02821 Binary files /dev/null and b/src/static/images/orbit.png differ diff --git a/src/static/images/orion.png b/src/static/images/orion.png new file mode 100644 index 00000000..0cdb5312 Binary files /dev/null and b/src/static/images/orion.png differ diff --git a/src/static/images/starfield.png b/src/static/images/starfield.png new file mode 100644 index 00000000..1ce211be Binary files /dev/null and b/src/static/images/starfield.png differ diff --git a/src/static/images/textilephotos.png b/src/static/images/textilephotos.png new file mode 100644 index 00000000..33c11e96 Binary files /dev/null and b/src/static/images/textilephotos.png differ diff --git a/src/static/manifest.json b/src/static/manifest.json new file mode 100644 index 00000000..ac904479 --- /dev/null +++ b/src/static/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Awesome IPFS", + "name": "Awesome IPFS", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": "./index.html", + "display": "standalone", + "theme_color": "#0b3a53", + "background_color": "#ffffff" +} diff --git a/src/static/robots.txt b/src/static/robots.txt new file mode 100644 index 00000000..eb053628 --- /dev/null +++ b/src/static/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: