diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..aa09d5f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,32 @@
+# 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
+
+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 9e133f9..fc429b7 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 0000000..b9a954c
--- /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 569372a..e69de29 100644
--- a/README.md
+++ b/README.md
@@ -1,159 +0,0 @@
-# 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
-
-- [Apps](#apps)
- - [Single page Webapps](#single-page-webapps)
-- [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)
-- [License](#license)
-
-## 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.
-- [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)
-
-## 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
-
-## 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)
-
-## 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/ci/Jenkinsfile b/ci/Jenkinsfile
new file mode 100644
index 0000000..4d7c284
--- /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 0000000..df931a6
--- /dev/null
+++ b/data/apps.yaml
@@ -0,0 +1,236 @@
+title: Apps
+color: aqua
+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 0000000..3366c05
--- /dev/null
+++ b/data/articles.yaml
@@ -0,0 +1,36 @@
+title: Articles
+color: navy
+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 0000000..e83ca4a
--- /dev/null
+++ b/data/tools.yaml
@@ -0,0 +1,79 @@
+title: Tools
+color: yellow
+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
diff --git a/data/videos.yaml b/data/videos.yaml
new file mode 100644
index 0000000..70d9585
--- /dev/null
+++ b/data/videos.yaml
@@ -0,0 +1,10 @@
+title: Videos
+color: red
+description: Videos about IPFS.
+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
index d333d40..d0efe35 100644
--- a/migrate-to-hugo.md
+++ b/migrate-to-hugo.md
@@ -85,4 +85,4 @@ inside `data/`
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.
+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 0000000..af9a69e
--- /dev/null
+++ b/package.json
@@ -0,0 +1,47 @@
+{
+ "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: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 0000000..6b6932d
--- /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 0000000..18dc3fb
--- /dev/null
+++ b/scripts/dev.js
@@ -0,0 +1,60 @@
+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 runHugo = () => runAll(['build:hugo'])
+
+const handler = (path) => {
+ if (path.startsWith(dataFolder)) {
+ runAll(['build:data'], {parallel: false}).then(runHugo)
+ } else if (path.startsWith(cssPath)) {
+ runAll(['build:css'], {parallel: false}).then(runHugo)
+ } else if (path.startsWith(jsPath)) {
+ runAll(['build:js'], {parallel: false}).then(runHugo)
+ } else {
+ runHugo()
+ }
+}
+
+async function run () {
+ console.log('Preparing fonts, css, js and data...')
+ await runAll(['build:fonts', 'build:css', 'build:js', 'build:data'], {parallel: true})
+ console.log('Running Hugo once...')
+ 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 0000000..96fbefe
--- /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 0000000..9aae10e
--- /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 0000000..5d01c82
--- /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 0000000..72bd658
--- /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 0000000..de6f818
--- /dev/null
+++ b/src/config.yaml
@@ -0,0 +1,11 @@
+baseurl: ''
+relativeurls: true
+languageCode: en
+pluralizelisttitles: false
+removePathAccents: true
+title: Awesome IPFS
+
+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 0000000..3b9c204
--- /dev/null
+++ b/src/css/app.css
@@ -0,0 +1,35 @@
+@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;
+}
diff --git a/src/js/app.js b/src/js/app.js
new file mode 100644
index 0000000..e69d8ba
--- /dev/null
+++ b/src/js/app.js
@@ -0,0 +1,50 @@
+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 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')
+ }
+ })
+}
+
+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 0000000..6ba5418
--- /dev/null
+++ b/src/layouts/_default/baseof.html
@@ -0,0 +1,35 @@
+
+
+
+ {{ 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 0000000..913007d
--- /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/_default/terms.html b/src/layouts/_default/terms.html
new file mode 100644
index 0000000..70fc88d
--- /dev/null
+++ b/src/layouts/_default/terms.html
@@ -0,0 +1,7 @@
+{{ define "main" }}
+
+
+ TODO
+
+
+{{ end }}
diff --git a/src/layouts/index.html b/src/layouts/index.html
new file mode 100644
index 0000000..265d3a0
--- /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 0000000..b8b1421
--- /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 0000000..4a76e2c
--- /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 0000000..25584e6
--- /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 0000000..9328866
--- /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 0000000..b868116
--- /dev/null
+++ b/src/layouts/partials/list.html
@@ -0,0 +1,78 @@
+{{ define "text" }}
+