From a8882a4cea3923334e0c15f7b69ef69b41bd2f7e Mon Sep 17 00:00:00 2001 From: Mathijs de Bruin Date: Tue, 9 Oct 2018 21:55:54 +0100 Subject: [PATCH 01/36] Update ipfs-search URL, source URL and description --- data/apps.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/apps.yaml b/data/apps.yaml index 807ad6d..e239d6b 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -111,9 +111,12 @@ content: description: > Publish and render markdown essays to and from ipfs. - title: ipfs-search - website: http://ipfs-search.com + website: https://ipfs-search.com + source: https://github.com/ipfs-search/ipfs-search description: > - Search engine for files and directories on IPFS. + Searching the universe since 2016. + + Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search API's available. - title: ipfs-share source: https://github.com/rameshvarun/ipfs-share description: > From e5557c593990a14c56f0a96a788bb4eeb50105b2 Mon Sep 17 00:00:00 2001 From: Mathijs de Bruin Date: Wed, 10 Oct 2018 10:30:11 +0100 Subject: [PATCH 02/36] Regenerated README. --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c2a84ea..9cf732f 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,8 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [IPFS Event Drop](https://github.com/travisperson/ipfs-event-drops) - An app that allows for improved visualization of ipfs events. - [IPFS ID and Public Key QR Codes Demo](https://ipfs.io/ipfs/zdj7Whr8X3zah99TSuyPjENaERcBW9C7B36EaCb1DEZ5pbbL9/) - A demo app that uses windows.ipfs to show you a QR Code of your IPNS Link and of your Public Key. [Source](https://github.com/ipfs-shipyard/demo-ipfs-id-qr-codes) - [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-search](https://ipfs-search.com) - Searching the universe since 2016. +Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search API's available. [Source](https://github.com/ipfs-search/ipfs-search) - [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. From 94500f2d88f86b4914bda180663cfacc2909baf5 Mon Sep 17 00:00:00 2001 From: "amar.lakshya" Date: Wed, 14 Nov 2018 21:46:56 +0530 Subject: [PATCH 03/36] add DolphinServiceMenu to apps.yaml --- README.md | 1 + data/apps.yaml | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 06350ee..2f9c704 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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 Steem +- [KDE-DolphinServiceMenu-IPFS](https://github.com/amar-laksh/KDE-DolphinServiceMenu-IPFS) - Service Menu for Dolphin File Manager to upload images to IPFS - [killcord](https://killcord.io/) - A censorship resistant deadman's switch [Source](https://github.com/nomasters/killcord) - [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. diff --git a/data/apps.yaml b/data/apps.yaml index 03e0d28..80f3f2c 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -312,3 +312,8 @@ content: description: > A fork of xfce-screenshooter with IPFS support! + - title: KDE-DolphinServiceMenu-IPFS + source: https://github.com/amar-laksh/KDE-DolphinServiceMenu-IPFS + description: > + Service Menu for Dolphin File Manager to upload images to IPFS + From 2409da1b044b1fd135838d42a064cfa6dd23b321 Mon Sep 17 00:00:00 2001 From: Amar Lakshya Date: Tue, 20 Nov 2018 17:49:04 +0530 Subject: [PATCH 04/36] Updated apps.yaml FIXED Description --- data/apps.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/apps.yaml b/data/apps.yaml index 80f3f2c..ba0b2f4 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -315,5 +315,5 @@ content: - title: KDE-DolphinServiceMenu-IPFS source: https://github.com/amar-laksh/KDE-DolphinServiceMenu-IPFS description: > - Service Menu for Dolphin File Manager to upload images to IPFS + Service Menu for Dolphin File Manager to upload files to IPFS From 569875765eb2b7dc648b67c9c98da4780615afbd Mon Sep 17 00:00:00 2001 From: Amar Lakshya Date: Tue, 20 Nov 2018 17:49:50 +0530 Subject: [PATCH 05/36] Update README.md FIXED Description --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2f9c704..1722d51 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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 Steem -- [KDE-DolphinServiceMenu-IPFS](https://github.com/amar-laksh/KDE-DolphinServiceMenu-IPFS) - Service Menu for Dolphin File Manager to upload images to IPFS +- [KDE-DolphinServiceMenu-IPFS](https://github.com/amar-laksh/KDE-DolphinServiceMenu-IPFS) - Service Menu for Dolphin File Manager to upload files to IPFS - [killcord](https://killcord.io/) - A censorship resistant deadman's switch [Source](https://github.com/nomasters/killcord) - [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. From 8fc0dd2508e40f1e19c382b9be385eb6f4c24b68 Mon Sep 17 00:00:00 2001 From: Mark Henderson Date: Fri, 30 Nov 2018 18:24:21 -0500 Subject: [PATCH 06/36] Fixing TallyLab typo --- README.md | 2 +- data/apps.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c909bed..f88ea69 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [PubSub Chat Demo](https://ipfs.io/ipfs/QmWZ3u5S7RjFXKfW6dSZhj7CozcvpqJxm48RYMmKkWcmNQ/) - A ~76KB demo chat app that uses window.ipfs, provided by the IPFS Companion web extension [Source](https://github.com/tableflip/ipfs-pubsub-chat-example) - [PushToTalk](http://timothy.hobbs.cz/push-to-talk/index.html) - Push to Talk lets you edit audio essays and publish them with IPFS. - [qri](https://qri.io) - Dataset creation, collaboration, and discovery on the distributed web. [Source](https://github.com/qri-io/qri) -- [TallyLab](https://tallylab.com/) - Local-first, end-to-end encrypted diary app for capturing, analyzing, and sharing data about any and - title: Temporal +- [TallyLab](https://tallylab.com/) - Local-first, end-to-end encrypted data diary app for capturing, analyzing, and sharing data about any and everything. - [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) - [ToDo List Demo](https://ipfs.io/ipfs/QmfFaH6dGibQ5JwEdsujeHBzsmHUsFRB5kU9P8nzPyzMv2/) - A ToDo List demo app that uses windows.ipfs. [Source](https://github.com/ipfs-shipyard/demo-ipfs-todo) diff --git a/data/apps.yaml b/data/apps.yaml index a8405aa..83dc32b 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -216,7 +216,7 @@ content: website: https://tallylab.com/ picture: /images/tallylab.jpg description: > - Local-first, end-to-end encrypted diary app for capturing, analyzing, and sharing data about any and - title: Temporal + Local-first, end-to-end encrypted data diary app for capturing, analyzing, and sharing data about any and everything. - title: Temporal source: https://github.com/RTradeLtd/Temporal description: > @@ -294,4 +294,4 @@ content: description: > Run your IPFS node on your machine without having to bother with command line tools. Manage your node, add your files, easily change the settings... everything from - just one interface. \ No newline at end of file + just one interface. From 20212e2926bf7a42ddac08e9fbe90a1901beead5 Mon Sep 17 00:00:00 2001 From: Haz Date: Thu, 20 Dec 2018 23:03:50 +0100 Subject: [PATCH 07/36] Added "Sweet IPFS" to tools.yaml --- data/tools.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/tools.yaml b/data/tools.yaml index df16037..4b76e4a 100644 --- a/data/tools.yaml +++ b/data/tools.yaml @@ -3,6 +3,9 @@ color: yellow icon: stroke_code description: Tools built on the top of IPFS. content: +- title: Sweet IPFS + source: https://github.com/RHazDev/Sweet-IPFS + description: Full node for Android - title: cachewarmer source: https://github.com/BrendanBenshoof/cachewarmer description: Donate ipfs gateways to cache other people's content From 08d0160e7838ac403e61dad345928fbe9fb25799 Mon Sep 17 00:00:00 2001 From: Haz Date: Thu, 20 Dec 2018 23:06:07 +0100 Subject: [PATCH 08/36] Built README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cd1ced..f3547e5 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - 2017-08-21: [Understanding the IPFS White Paper part 2](https://decentralized.blog/understanding-the-ipfs-white-paper-part-2.html) - 2017-08-10: [Understanding the IPFS White Paper part 1](https://decentralized.blog/understanding-the-ipfs-white-paper-part-1.html) - 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-05-05: [Decentralized indexes for public genomic data](https://github.com/luizirber/2017-recomb) - 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) @@ -112,7 +113,6 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - 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) -- [Downloading nodejs versions with nvm/n over IPFS](https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmUx363UFtgiQqkHHsPK3TSDmwoALDo2hrbMWbcxjH2vFc) ## Datasets @@ -153,6 +153,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [ipscend](https://github.com/diasdavid/ipscend) - Tool for hosting web apps and static websites in IPFS - [pinbot](https://github.com/whyrusleeping/pinbot) - Pin content via IRC - [Siderus Orion](https://orion.siderus.io) - Easy to use IPFS desktop client for macOS, Windows and Linux [Source](https://github.com/Siderus/Orion) +- [Sweet IPFS](https://github.com/RHazDev/Sweet-IPFS) - Full node for Android ## Videos From cdaaed38bf7e838513e6436eb2233d62a2bcaa00 Mon Sep 17 00:00:00 2001 From: Ben Stahl Date: Thu, 10 Jan 2019 07:31:00 +0100 Subject: [PATCH 09/36] Fix broken Partyshare link --- README.md | 2 +- data/apps.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3cd1ced..f507ae9 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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. +- [Partyshare](https://busterlabs.github.io/Partyshare) - A simple file sharing app. - [Pathephone](https://pathephone.github.io) - Distributed music streaming app. - [Peer Bandwidth Demo](https://ipfs.io/ipfs/QmVaVXbLdw4R5NqAiiQoTWtitxo5g7FS31PQmCLbH9p8Fu/) - An demo app that uses window.ipfs, provided by the IPFS Companion web extension to get and graph bandwidth info for your IPFS node [Source](https://github.com/tableflip/ipfs-peer-bw-example) - [Peer Map Demo](https://ipfs.io/ipfs/QmRPGCmLKH2dQmNiPRsiuYS9EhhJL1Gmkz5F75gKY1K4Bm/) - A map of IPv4 IPFS peers that uses window.ipfs [Source](https://github.com/tableflip/ipfs-peer-map-example) diff --git a/data/apps.yaml b/data/apps.yaml index 863e721..3fb7b1d 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -147,7 +147,7 @@ content: description: > Distributed, peer-to-peer chat application on IPFS. - title: Partyshare - website: https://partysha.re + website: https://busterlabs.github.io/Partyshare description: > A simple file sharing app. - title: FileNation From 26af842ca8ca98c21a99a9ef438bd9100dc4227a Mon Sep 17 00:00:00 2001 From: Ben Stahl Date: Thu, 10 Jan 2019 07:33:04 +0100 Subject: [PATCH 10/36] Update description --- README.md | 2 +- data/apps.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f507ae9..a3b3624 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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://busterlabs.github.io/Partyshare) - A simple file sharing app. +- [Partyshare](https://busterlabs.github.io/Partyshare) - A simple file sharing desktop app. - [Pathephone](https://pathephone.github.io) - Distributed music streaming app. - [Peer Bandwidth Demo](https://ipfs.io/ipfs/QmVaVXbLdw4R5NqAiiQoTWtitxo5g7FS31PQmCLbH9p8Fu/) - An demo app that uses window.ipfs, provided by the IPFS Companion web extension to get and graph bandwidth info for your IPFS node [Source](https://github.com/tableflip/ipfs-peer-bw-example) - [Peer Map Demo](https://ipfs.io/ipfs/QmRPGCmLKH2dQmNiPRsiuYS9EhhJL1Gmkz5F75gKY1K4Bm/) - A map of IPv4 IPFS peers that uses window.ipfs [Source](https://github.com/tableflip/ipfs-peer-map-example) diff --git a/data/apps.yaml b/data/apps.yaml index 3fb7b1d..1b487e6 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -149,7 +149,7 @@ content: - title: Partyshare website: https://busterlabs.github.io/Partyshare description: > - A simple file sharing app. + A simple file sharing desktop app. - title: FileNation website: https://filenation.io/ description: > From 538626d700eb605111e1c05548636c3ec07fe2d2 Mon Sep 17 00:00:00 2001 From: Ben Stahl Date: Thu, 10 Jan 2019 07:40:27 +0100 Subject: [PATCH 11/36] Add new metadata fields for Partyshare --- data/apps.yaml | 2 ++ src/static/images/Partyshare_Logo.png | Bin 0 -> 18111 bytes 2 files changed, 2 insertions(+) create mode 100644 src/static/images/Partyshare_Logo.png diff --git a/data/apps.yaml b/data/apps.yaml index 1b487e6..f70e732 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -148,6 +148,8 @@ content: Distributed, peer-to-peer chat application on IPFS. - title: Partyshare website: https://busterlabs.github.io/Partyshare + source: https://github.com/BusterLabs/Partyshare + picture: /images/Partyshare_Logo.png description: > A simple file sharing desktop app. - title: FileNation diff --git a/src/static/images/Partyshare_Logo.png b/src/static/images/Partyshare_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea59c4e3a8e8194b092f429e5e3cdf72a47aa9c GIT binary patch literal 18111 zcmV)6K*+y|P)4kJ46hT@bN)2K`1e7A>50)n=JW)~K zQ+&P`eHK(e1s}?@gNlOs>>y1=X;MQ;BOwWCB)Q4$Wy{R`f4_5fc4zm_?%ln2_ukEg zFWEb1&YU@O=FD%tcD{4Qkk@EP54f&t{b9#Lv*KdRa|~miIPQGgHRsu4&T(C%9w*c| zj#=YMDC!EgZjJ34QJiLpxLuBfI$SY24UvwdV|0kYeWw%oJ50-19d_MSm(QEGW5|VH z%MkS0tDF9@`yY*+&fwCdBg@bk#{qQvJFYdyaf~p)Caw#JaVwSpbgHws@3{KM45pbU zhLOtGTb2fpnJo^^cX+<4&l1;gyTr9tVRyA_n5$4`wOd>N&ri&3YF8I|mHyE^{3^Qn z`*;3nVM5$xju^`TmSwp0LtNK12^K_;>%ccRIDsNag?5=bre7_;?{Z@19gP)vk^r^zHl0UBsK>lU-Z;!HF z_Z)!kTmWc6hHGU&NWc(WBoBlhCnWZUTcD z*X85T^>AM#lyD69QOhvzcOC2A&m36$h+!D0ed5xD1>}S6cN}9I=DD_Qoda$*kB^X` z@<2xL5HQ?V0Oj!%C{-Dsh*jJzwNKHjIG$IR;(+?x48Sy(OpAD2M}roeG6hlvaGY!4 zAItGUr0d2tl$hrWLY*O{3IL3o#Bgtukag>dMK$YrPZNzM6d)h#ykmaMcCP@~&ckEe z4|-sVi;?@0lW72Yz$B~j(h497WEl>okLmq1S4A0>Z=}kh63YlFP$h5;kHe+G$#SY4 zTb1a!gs8gZ*=N|`~Kev0mw(X zfAR(=VSLOM<1FZdmI4v4O$5mOJS8LTuW2jadLUqy{u912x zA|Ze)Y+BfwY8zJD6i|Q#>WvBh99QCwgCDo9#PI7%*s>>XO9!^?aYwon?0V{!TAyTF zvp6M=dEn+&gBi9v{;|Cz>Z7pW2a)=ni21EAA8hl-Pd|xAujv9%S5Gi8hZ# zo%>$Ghw+Y)3wf2R6s!b{_cDK0yc0LvBa$<`>m`Y)#=7X^XTe5Viq~l?Gq2 z4|33UWmCTf=Y~E*cE;Qk*W^89UJwG3z*O8az{YV6=P|>yzVNjr#vh8kcD0n-X8;Lt zXgt&Nzn3^}=u1gkW~Kp`;&=*tJ|OzVGX$(miOi50H8TOkRtcG*YU%%i?dVIovcA`q zXSzhz^bnNfncN};4oPB~N!~9>r2$f^4@f^FruoI|4zPX&j+!c=%T?>&eFBgxyT5yU z(s92IE_ft6-ZKPp4HeBDwP+?lTS8N1X3ZR#7M;G&fG{6WdI8Rr0Opf0UtWf2_dp14 zh&0s@bPS&+HgLM9(<)Dlr%Y2mc>Mv9$Me-+E%{Xq$Y%#{Uf{-!uR=V(OL0Vqstg#B z2I!QirdUo{v-P1S0C28MkM1WmFia*QQItP{fygJj9qELa*W6HplHgPvG8dwSMU5jv9=#oSQ<^0K|i(H9T$9ow2W0-~fOtdu+L9Z&J3# zld0R_qt%8_T9l{uX%NAA^?-zpE55m)W^FaychvwAV#i$9cf-Hi68ao0e~IBw zyA;E96Vqz0Gyq<~h|ulr{jzp2p$(nXQzwU1yb@qF@ed+AW|+p+-&)vsbEVsqul{iX zFiq?pn zb(P4h{r$NUCjEGCOzzmzEASR6GT^b$2|y7qK2%E(;@}PIcBiT7vYV$Gy}H2I{T*{a zZXW#d0^4!#0ucAtdLoo;8Z3B2m3UTLa>YYnv@AnZO9e(%?)sj{-+mF?%O{>E^41Ro z9~)(E46)#Le|9C*K5AzoZ;Z5%Ug$^P-`yk655#dvTr}k(()y%AB*4jhSyg95-*UsE zx-Ho)uIyd~o_78QZ;5|?shxCwkDHyM^ceL@(zU~m(4AqrA(>sf9DrPuzoO9|;X}wr zg^uMrr-=Oi%@|?1Gq_;u>qVw54?b4z+y={(tEM%{-QE52o4x%QP~a7mf~1s8J{J>t zu(}WGm)Jk9+R%0CjSHJ!EO$Hd)i*}(rO5W!inGL)zW{j3Jm!dk*0O2+kxOFclsQ=z zHJo2rFy`xt3g;)f^IxFQvHWL^{0RH|tBfnZ{XO0OVw-2tk3Qp`_K~JnzhKmx*5YZfUN%jqq?>od3Mh9&T;do)(w*U$5BI&G|^=lVM_ka@NQ(EMV<~q$4$r;HlQyi0= z5)Y}xwiEYW@lxk$=@ToIs3;(J#y@)*UbwFigi1tHPXq}0k22aoSlFDJv!o@wq(Zls zr`k!=^Bh2SYk_0=&)TPt@Y$T%(jb?#HEA$Hw<5PBhg4f~O~b9TUFY{7+|c>1O5QB_ zR7Gfa?3#CDj`L69+QDsc*e~TtEbJQoo;;{x`M;j1R$ z(c6JXnCtdI_sA4zXY~sTpFfsI*9^ww#@%}b!{JJr(ML&Fka82DA*N&WhC}8FH_dB( zy4>w5J0Lp}|9(QkmAj!b)+(nrdOYE9wx0%ONTwlj`+Nk7@!uR}cWHMs@&B1x!PB)VOuWesf{% z%jLYwvI4R*{;4CAhVcM=uT7lCq8#100RofzA!8Z>XD`Ma7L17OV>EyV^Rq1?>v{?| zJPfV;Y&g1)oB+;(otQ!QrJe24g8&V!`D@WlKvINTV!qI5w7j950l#H4YWm!3W+V;w zkB;Ls(WgkGMH?Y68H$W2?yH;~qD|){Ks(g+p@n z)Jf3u@hDLhIi=qi8g!%rdC-xRY^^}m zb0ZP?*U7D5B(${Ax$2qf3(*RP-}01|8#*x-TOP{OouyUYnYj8Z@bUi}MKpEA>_CYc zOe=T~9NrwTtvv1clStR9%yp(7FEVLqX1~Y?YnKMIpjZd2@a(J^~Apwj+ z4T{{gQ)ELV}yt1b_ZQ)Vq5YJ*gDzfqEu&mB%!;n{59&1)}ABXk*?RKzz zr9)z=7l>>cJ4$@h;4!RE-@LHt+N_gCurq27+2?-j49u|nq!QC;fbu!g&j>Q$=xz&h z^krn^q*vmwxGFP$>*%^#xu~^S>5`u4hUlYzQgKe#vH$xc8~Tpc z4H^00Q2}zm{ph@;^s*afo;C0zTbpLhih=26gy0qMFQj@q_;CzOa*g+??&y*X$lEwWnk z7^$-k8%5JfKh;84Ska;9G3;xk)RXgk$qn<-G+aB9)1%$MPg#g&{(aznx8r7ZfD`7U z*~2(Q^PN{@{@KlqvIJw`o-XN)eJgF!wHNpGbbX`9ssfAUbYEbZz)bYd^=Q;lN;<1o z#S_z5)zFxZ*??~gJg?H3SRrKy#o#v_DTQ;?vA!ID`s<}_;Ym*~KNp~0eo5Pv&=Dz~ zpT{=MmI7)x5ZvoHD6SPG6B6(PlbfXx$WcKU-nD4#sQ<>lT)DpcY%jai?T7%GaIaVf zi|YztgV%#Y&no!BgL@f28Al@-TpqiN@inNBjKaC(4p$`xE}v0HxFLTsIe4A%wHX+EVboX^}q(7W_}L z;R5D4#p6LxX5WCu)s@Us3O1pXgJ(21$hyI#`YG{^H8J50Qm!CG2EFNHFZNxE`hHYO zoh99k>s~R(5qpKcfCfLo$XCOZDd3K8FXh@5DI0<0$|VP28fjEE-8yGN_z(krBBy*9 zy6HXeKXQCK7mTxjmt~~@l19tz5YG>xvO-{-hPUH<+~k`ep2rc4>oa@TcB78xIXKYMcpcj*1l^CP$-39tckO zc0|eLf->K&Qtza%GL!@2eC1U>x#I2u;<*;eAwhTnz&L&U``Npf=8z?4x1!T|uc`Y@ z+ZKj9Bi7mfDX(lX+oA!PbU*lZT<9!blRB&l00$)bVnmE1FlTyUG1nWDGUXQAZ1fw! z?Jfn#T86>G>!8y8>w@9S4e5x^0_OW+c;N5B(9prKqN|WjXsnUB5k26oaOu6dl$?g~ z@vGOnbBb+tQ92}jjtMt@6BSlZG^w;wb86soJfqm_jY&C*?fz}qm&)};x?n~<8?@8B z0RRee7iHI=b;iZ}i(02~4RpqKh;7D0Hli2z16DYcI5U7d=hhRrKNoCuBZiuS2+Qx` ztq(d<6?qih7fx=FuWaj9%!)%JWS9I4=2dGa2d_o)qGB3b6d)4`jwps1T2}V(GIGJ~K=`_Vp`A5oH2eFlt!c41Tsz15_`GOHPH2qE-!T$E z37UR=m~f2?u6{9o(+!Iwj}F(aVF9TkdE$HiJ$(URjh4*Di@VI1Gq%Y;BzMS<6Pt!y z^nivI`G_2rmEY5D%bkDfkb~Av63fm8tOIGe@{xX7HDf34$I1eD2JG-60Q71<1^i4} z=Vx88)E#y(0mtwm0x*{dR7#|`u}tp4>exSXQms6Vk%K;ZUz7(1?IJqq{z=N$q4F(* zWJN}P8Wxa=!S0LE|MOHWsj7Gla>uA~4mRW0J2CZyhThzcNf^<{p>WcYLsvnT=b^e+ zBJ$J3%Xy9#mmSFg>X)O3${eG>SYvLr1m&B-ez{#80Lt|M<=>&Jod|bN6;d4*Avk+d zjoh|#5aL>cML7n66-d-$Ke@)H8|L?gnqCl1;EpE1{b^RtKH?whj!av!1Xkocq{ffp zm>m~H-E|4+t0`cy2AmX4gruz}XILhnT%oME>qrlj(>-oXwmSp5&kCIobc~&QEL5PH zJdcKri}8zV9`HD0Qb0x+gzIHp2>Y`CTusTUP~5ACj#1wBFjcQX z6_4%J64N`C+ZMPn&wvYy)l`CL;GEVPm7nd5Da;T#WMZ^AAgxdSe8sh;v zb-`8e#Fk+=a|6JAJaoqciqlE+%Z|c$AGWG^9)T#*dOpxv>6nUnH#sd{ytheCjTCP%@Szi&+uQ;9z`zqZwTZIIhh%yg z-t>cKpc8t|UGJEGOWFE*aK&TsD{1J*U&+{~mm#v`-aWSTCDDFmachkdI}r>iUWpd{ zM^LK*0ok|vD>Du0J(bW_`lw>P+@Ue^wxD{(C6Amem*|W1sQFM#Gr%v10!MS8bCp88 zQVqCZkgmuNbEX8=&?-6ofMeD{5#RpO^WbGa3EuXW5=6iM{BcZ&!Oc!-4ax6zVf_-~ z2XC*oZ6I%5`QQy(+%H}|#~9*t%{)C{<6S3t5m1fK+iUJZBr1IXfwz{C=L!4HAFE`L z4jBZFp!Vbq!srSrT{y4kc2GPQnttG2rWt(V9g{F&3%`93jNWa$0c-tv156q}`Un8o z*4}Mj;Fa@l0|5z>=u(1FvBcDCPV3rq$Il7wZ?u=DnKcbj|aIc<07?1I4ah%lHbx=g`blFTRffSKBOY%LxXy4{M>U1;eMX3F{3D*!U(D~u zgy~aOY;h;8m}6uqN<#pNuR>j_nWFZ!YZl6!{ZSo;t*VFufdDPHSPBfn7y*Y2)Me4- zS>(yCtW4~1`T_OCGDmzf;G^v0?W*n6+jC(~d<6IVqB;Ys^cvEIVS3HrILHEQVeM|a zJ8>3H{DG=A^(PCEu6s+kXVbt1Sms--P#k)rzBDT^jbr`iRYf|+d9OKCtjOkRfrbsF zYN-@t?GI@O-8HnRy(tNte!vl#!{K_;93b$r{V?3NV$^5q)lfat`;zS-7 zZWJT@dbM9oe?~2`Cl9@wc$NSedORqnsCIDr;ssMgI3CUSh&p0{6(;Dx`)zWY8egY_ z{kF(4;&x%W2u`=))xtOEWvu7X;p^Q)z{vg}KwWt;5Rg26REsHp+fB|$e-mtT$BX;DLFVRiW(gC3?*Lcw*yvHrd@(dHj{?al_I>n!&UC~Jn8#(y(ZecTaW z2Y^30SC@ep&NU{|H#9V1VWg0s)F#*Q6N7n60%U-dU5at#UHk8LyL>;fQC@cRu;=NI z&lUbskIyTnwhWo;-Kc*puhX9uDdE<$>Kcn3THCK+DlfSs?}ru&nH|#S;LnfnQ#Vr6M>%`Oz6nr0Ws*$av~Dy1Dy zJDu`90CBYqXL*X=_3#2&{tQ@P5!CsteyL`W*HkH~b&q!GSIaN9A-Yfbi|d9?HVnLC zaL0M=cZ~SS0IiaD3Y5xkgbZtTRf_8%y^Z%$3J_SnVIf>UK0rp`NT{FBBgIqD%TbJj zex1{+fcS)+t+*b#X;OYLGQJfa=;7LbfJQ{fDUIQ24 zB9W;lLq*Z{T+x*TTG_rK%-o8$V(j~eiB0lXdp91=P_^UC$L8mrB9AZLC4WA0vn-w3 zDjytJBppu!fKO6_Ws0^xjDej)@z_dif2M}QDMJ>ackxY|04v*&#RX61vsqa0${Gw1 zP++T1AkeS@C}C|Mhm*4b>DuAtIHboNag@rnWyJu<>J!(z^B}HNDtBZ(lnK)jgu&lP zDX1+$9I_pAfNq7ca+kdWi!1n$fLX|{^pD0*qu@$BT^`@-urG?FM&?3# zn?ry%GFOT0Jkt2zqeN;Gs<#8;_c2LgigW4P6mzx2G9be=k{ z10y&wOiw>Z?c+Rxo9C*&8|Log0ZM1Y_kemaq2yhyptk&{FltAEI}PB} zWUo{{t@@Xs3+57E0&>n@0faxtT%BH5>Fl}1()$f?D!w~BM@~u1!A!~w^|i(&7S85K z57@ip0!($DZ`4c8^lU&T;d`%EnhN(%J%HHH^;Yn#)MBS-tm)cwZdlts>*@n0Z&QE- zM3?X;ls-c?nz|z^Qk~q9%?lc?OEtT!8*-$CC!+9j7fb8yUb!gonCyj^E<^u^dQuqTn=B>=1< zK4zlS3@2dFWa~4!M0Nb-u-bT0Gx+mdvr8I`7({VIHaRWQ4Z&Uv@gbaOO_ukC=gaJX zDYEtRz%cLt{O{W__so)ePJczVG-c#*Q-4@?-h&U9W)CY%!%*xN)2uNoGZ`}ywI7n! zHaH|KZ2}ZOWr~H6FxsE^^?}T!sAh*T&9Q95nlxq&E#*S1ogR4#&g8MCrRG-Xc`wL8 zW;^;RBfmKh{sm_Wbj3sDpU%v@%{mJG`7Z!sp+E@}xNbfKpEiNB+atTfkWbxyq&&WG zm+Wlm$8_BqIc(!(sUOVN@9X!&NEJdUtC`vm^+b-Sxg#Aw_@ovM9K)T*c85A2y?d@$ zE>=|2nj^tTpOF!2!b#PqkdT947hjuZ`@9K{=9%?!R%jOHxnPnOZj_d|ny{5h(-7h> zouASVSymmxzE{RSEEz_9ACEjDr-U|nm&)1_oQGJu;n6nY8sY;5`O`0?rTboB)JD$@mW5*%ZneYVJ!Uk)8-&nc>QT}(Eac{)}S35Z?_ zDnFiioNI%b4bqG650aE*CMXTN{^re{trX!0dfd@#C<|Gk>eG&QVnvAC;8@N_T%jcuL!0IF5XSO+^nF;x86odGkSAFKW;pL+MDoneQy`VS zy{%V%@Xl3IyRekn3)D&FwPPo~0`&~WPVPeJ(GRfr$^T$g*1s1xskB3FQGSe7iD{)z z5`_F=m9*I*Cmxqvb8-4!SYA1 zdbQO-_*n5xPQ^ZgYo!lm{*3PBPrvmncu9Dr+?`wqUdbNC^M$YSKKKvcWEHREG2&>y zcVn#mWh@;Cd=COAJ^e}97U`EASP0>n1?}?Oygj%sFoT!zEVz$~qCrTQy?A-O-yUDO z6Bn@=k&{CY{RWHbzhC4eG-#C6hS<=TDYDUWif)p!TO=_n1ZcJZfye>~{dy$FrK*TH z?)%T2AcUaiF?{Pd08(qjK_!aM!^kVTtUK!jQ_e-*1fxgwfZRJ#t`6Y)m6wT+_YBJ6 z=1zIinUT)>QDT#vVod?xEvdCTCJG~23#Zb`f})X9t${}Wx=T*7NEIT4ML z(Nj-W6$aMBq$CL@_FQ)SV(ZX(@R*XYSq6QgJ-DvIxl~CGvYLhz`US?zyD@H_rpNDw zywB$F>0={FoP6O(&KhzKr^nLuL(ZrOUCO{+%XDh6+@7n(1{5d(OdI}3riIIqQ~|Al z&yo63E+u;h&`#)hgYn!$YAL)wCSMtnUwTINv<)|FlzC`vxyJ_(qLEAFWOwFrvfM&N z>~nM{m-;YXKH4=d({)B`5dt+I>zXga^xShrF25d=(#}X99!-LtAA*q**_&UZoaG1` z2!R#CoYrqW3+T`wm*F!H#g^7+uDXWaG2BW(^(0*_?~k_*+8LN)Fgn zm8Sj}lI!=|jw7%z1WMfyf{rHHFTo@us2o1<4o-F^43H*0P&TBdVlrN5Hp?+^wCC#8 z9Kkv_G+VE4bl_5vzy3V9Iuod9f}f}jI&Ld|llViV2KSk+S9~h?+)?IIWRnO&#VIMk z$t)cw%8{B@O7z?ZS`8xm4)`2%BWVauyI0RS;Z1SfL3<#MxiL}hriqJ>iI@P_`IN z7bqfO$f1C_)^}K(R;+W4ESrD3p%2-Uye`nykPG7VtRPhXS}< zx`HAS|ALj?9v|$;dSSVm2UV6&MD`b%cZlY4G-&)ZYmvwmHzA5FY(GcX7) ziK)6NFM)T??chXj2PdlcjhcAJircoLH=g30E{ho zso$wCdlACQJkT-Y>_-;Ju>j=JYo|$Ul_gy-VA(+Y+8==dJc4);25B&I$WM$$r~6CM z5pTi(H->(4>CxZk=8V}sM{7tXUTqV@hk7O=bBrj4wcSDQekcx=zD9(OBhlyh7#!TW zL_;PY*#u+`=VV#BLb`J1faI$qIKKt_^~312Y?n@OS#&AD%kogrR1xZl=lRrzP|g=1 z{Ph&@`TL7yrDtNk{OJf|^QgJ6Uk=>1O+wH7MRwo+Lp{n8qK=(IPv3{2(v0epbF|{S zp6^kOX`|Ovz=b5CLnb0IEFh`GwATuT7!a7bBG5Zt$!$KLBLU|o14am zTgC%;%0EHG_Lbp5qt7^eI0yN!$98UDEp>o1MfWZ74S~mt&fE^& z@28*FK=hpyL3+M#zv$#1fO;G#f#+#Jhol_#^hY&PV;H?5Fh_`NK0qD@rP5fm6yw=r z3&?yvN1LL$7&QX7K;VWN;6w8fEl(Oq%JTH(k1RP4;G0+Sshp-TT76c2aqSQ=mfR5k z2@4PR?~PeHnHrfPXCx5SFe08E!uYyOBN>UgbcWke1m$AHhUp~IFd)W~X#5BI9Ag=u zV=?V`f4nm^9;^r--xFk~)*<(mSK1Xsz8%lbqq_|{bwq;4n^M|lJ z|1)w>snwOO{OJgOxN7;c^6Z8^ss7GXUDIgD)zcSbGICR#*D&Wm1WB&RJu+n9hSU3% z=4N@NwMBN|*WWr-&Y594st}YgkZY#sM*Jm+8HAT zI;A~!fZUzO=a>xeITq86P7FpFbxC~7*-wANVovMbUZMYPJcv;~XJI7d%MGgoFMp)n zi1{}3ZRVj1uEDa<5ZhbU;zJSul^R_E$kN;Ca(|O0U#{CD4gu_=`sn_0IzE?D4U}-e z9U-r~IufAm(=%~;G4t?uEks0`@@z(^1(?g$;yO9O^I;GD)L4v*2S0gp`C z4iJ@trHjguv^B`*$hXEnJUEhiIo2KYQgQ6}Ij3v*DhKg`Zovz|uWIG~f<7TUe2uCE z`}zF=;bT0w1t9%XKp=@aahN~Uk3WZ1JN|X>>A+=Lb~_wO9UrSYx9NS!K_!iq50WD` zz#Tzpn0B{`uXSxy&TwRMrXeGJxJ~p`-THnlj{ZDfB=;D4L&Y^8)nrG&K0i)>LwuZ>{H{{DosEl zICr;cCZd}>5Gs!kUtuKdfxe2j{eKbX$RG$m(L%N{HeC*K5?JjAzg&9W?vlrxy}8+A zx*rr|%LZsp2FLd>)Pvzm_TR;Wj|t}zeNvm47vn)Ml!!Qc93^ign>1t_B_J~SZ zE?8tGMiX1$;b;E;bOrUr9;qH3Tx44Od) z(ODGHxEGQV*J5;?H{*!i=G=GAeZ@^g2kC#*B0CCk83iB_uuvgOo6Wc$V#YuBnGJK` zb9CcFIU0|Rl$3FlikQk4<~A3o@)INAe+M1#;(^DMVO9u?oCp4H z0P$zFOXUKLqgM+Uc|Sc6*9w5t9l`&Us3tfKTe%*vCIC%rXLE{0ruqP81-MkDxa6IP zbL1>MKQUrQaYuh1`XF^MMasfP^~h6z)IIJRs~{&2P`V^h ztFCVVAOlzw6LT@kNc1`K3j?|2Ao4pXS|_*MNcL%M(>G~Gvw^e~R_)yw!FgMde-8a1 zmrg}YSO8?P@MgK_{RpysY+x_=U$&mY>Aqi$tyMZUxp^U?|M(=hi{6KkpjiRy1r<7X ztdDgkIsUJMWGJ=?PU>iwsSOOKu;(Nrk5EjLh4MM*&cVXHy@fl16_iRrK1VlU!_8D= zluD@=OqHiDnfuUr=*Qra{K`ro5qAV%?k}+L$TAmVjmMMntTM+Cyy3ujG^R0pr{)Ox zEY=IFb}+Jsx)Oa_e@y9+Dyj@}$}&?Tn}rbI`LMDi@LVXWg|iUxi?x>*kU>62UO(Ae zSp$mKV8oCc0D4-rza3})+<_*v{yXbEN=-cWOxd<9Pa#p5*cR7!hUmf&m0a=+w? ziaP>`86DD698!sFC$Zm?BAdaYQd14_SvgXot5*eCm?16MRpto)A+zPSL^ zOBmK1j^<)Pt@i`K^kwdA)RE|gdrHTIDj=Frhrj@l-gU;blQ;2x6w>Cu*BIP*+eWNb zjR_k)65zbEp(bSZB*dTt#>Ts9ic_IQT^B-KKSY?5-2o96xAb<>i@wV+2T zY-oV+FRi!1UBinJud?B`AIKTQRWk)KC2}mus?QEf8_R2#axF#%T>>Ef6u!iB;Mm^R z!RR35Y%c+s(i<5uuE2<`u0T-Gg^Nz_DCP=Xz!7cY8x9 zTlcZ*D!{J13+8M&ciR}_7a*qzMem*;nIrFkuE^;R6M^=|yTR}H;TF1f{Kky)(pzU} z{gL;XW>5RQf68{~>CZ6JbB|E@Cop5}-OMfvG17%A^m=4Q@$TouEqcewx#c_?t1er2 zENA`Ytc!-r`$F@}S>?Fb)sD}lkt=#uHIb>)#(n8(w&xQHQv^Y4T^^+B>28T4mAu8&>YL)c{fLdlCHgbCf92*@L_GNGU8- za6tH@|EJSho$*w~l+Erdn>sOlx~kQGZKm=y5Rkavw7BN6EI?x6fIIO;uP=~8df%{e?TGa6=#v(RZ7WiqNnaF2{P>Ue?G+=8 zWhzm(w_Xn$R!%Y_y8e81s%a9mz_SVz+VjAuPslErRY~3*GXRV%{8o$_9g1~(CK7eP z_c(yjCclNP-$~n!)|e0Y?=>y5nYr+?rgfOB{hZPtQ?Ze%FbpDc$#T&&ghRapv+(>> zIdKY6UBHlW5X`}#jxi;u54rQldHoi+fj<-(&HV8(y^EqRwsl~u=7!{q@Iolgh%^QR z?mfBbjCOxTS%BmL*D&tnmZF2?1?~2|JTy#76&T^4ixG`d=ljY7^~l_@<`Gt%b(&RI zz>ooJ8*OBI*2Rk43DJ;C^{@YwD*(okuS4Xose011u6M?^r^GYGw3a6{Y=E^}b6YwD zkfC_wm$a@4ME;b91Z>7T2b9H~Tfs>8o8iddiVl9Va#o%29~(*9!0bCK#|iGQhk?Kx zQXETCFCIpVa_I=GRXE>fqS3C{F4)!ytv9CT(kLt2bh{fSPyS8r{SE=-yek`58;1D; zYQT^lT|atC16@LWFL&ggKdODMV@NUOkp|FEMc+GK>ek|d0h-YdIaNib7qJ?~kP}Cl z5u$OGLmZO48WG(Sk#-DjQDD>-wGKOD+7jo^WyUgucxBTNK&r#>(CySCm6i{;y5f@9 z_HRX)RKS8x*;N+5$Iot1boV{xZd+4H!u@l=4y1x5i|?GUd*vRUPEwx)=^{ zE*dq_D2Bk5J#kpqw5EN!quRHe9|zrUARy~P<}JVkLh^LfkLNH?;zN)GWjTq)&2)^@ zdZhe?Ig5{a$BN#9E9Nez;y;(mKnKmW@s}xgn)hV}_(AD&yfBpgQkMJL<5l0w{p-P7 zV8lRQi+!{w60BP8mL6#qd)oiWK^;4vnSND-8Nny5ZU-eUsuX0{E!q&Oq}j+|jgV3JcB zrh6OiJrG2}PmML&wcijs>Jo(BFe0;)y>OIoFR#T-NBMkkiZp>ehhQC#gg7)v%Q_#a z=?rC5JMvw}pU?0;j@#$bMD#g&_qcU%J=hqc^np7qvQwiprWp^{8sGKGO#RvHiZuu2tppNwPuY8@Usn=r}g4(#LT_%IBEPiM*Spm=5}CgLk}ATV-73 zR6bFCj=aqz!s)gRyol$Ttvf0`QtTftt2;06Jm0*4WW|`)@O6(vDnldnoa1{CYPG$5 zo!e1&q~CM4zMA@7o790E&8cq2iDPCa?o7 zDruR4%F87=hMPMrv{+}k8j;Ck$Ou-$;PNbEO$v-ThRj6v zIkJDZ4Xza%i!v)i2KuAt?y)S_F~jbchkFLY0&>xzHMe4XdzCkYsAhqs?4!L;V%fJc ztij`NB)`4l4O=qbMBqgsG0Za5HI@I8I|0P`-d;#uz~PEy=@FTs#??giIkFRDcAsn= zcsAwcfi(@zNLHq-YuCABY15_ahU@HM0co6UB(aR&#|aXOZY8ogf`eg28=uPUUQ^!H z9~NL*=<=K)G&S~H;7)>!2Cq2hV>5tatSM+jWt=?1^ga6t{0by77|d zi)lg8{bNea$6dPy7JbT}h7P8K+>J+M?-S+ak~1)jc82fUE4-1wsSY$`3It?uIli$D zp1>0cG-M{S&yj}AW~@2H#p|g%5`)uukX#uMo9&JAiM81s(EVEL3vuZ9tHBSD7DMD{td54I1k zM6fkh?oE$Zb3uC@_XuwJnS<*8-;SWZ3d$=Qkm}@U?FzV)I_Zv7z*NyddXdw;Pwx^t zRz6*=72#=&2J(~gOM)wsD8_@P0C?rc#plSF&VWd82Hj4yI7hFa2kZ{SJFZLtP>;&! z(HX8z;XZjp)BA7s$`-RN36KX|ZnWd`A)hB0l_d;o+vAwYUQ5~^#fK=%IL>`uc#d#h zvPb^Fiy))HD>v*{zr2EF-kLez$6@vKIdX09iAXjVIOw|O|>5Y<=WHBdOD zCZ_S`hL+Lic+muna~#B%EVd6m zsJNk8#Y|b(Dc_^vxTfV^zR~nOWH@-ahXY?2r?NVZzZk{w4!K0k( z4zB<3??&3CBL*ZdSYwzUa+1-P^|uiLOwY&xFsV;=y-=R$ayF7n&=n%ClFK1Ru7ts< z3!ICs=6fR+(NI6EmIK$3auZ?9TN!03HKS0y!yOAUt|qF_k%=^q z@~ohCS$M&SZ?w>f)Pz+BGct$VlRpG(P#mjY82-i7>KBUpk_*G%m3n}N)G&(xdMj%?TXi^&m8MH-8_a*j>ygj+p(-) zKX*q(hao(TtEcg^7v38>stU_|@iFA9pW_c|j-GICp5Eko z*&d^f!ss1%PVj7%Is+cbJS>ND_x!qlI~@$7BnP;^@BHbq0g{z&zS(UZ9B>|nK6#)K zVgyhMm|^IZSdG`JwPePdr{Pm0*;c8)LDih*>V_GBX9F1q-nf1CxKe#KU~hpDgZ0M{ zLPii$JS!hBP@~lx_pyfBrcZ60we9%zKu>ZdbjClC4Jyva z=cgEplF9(4AsgHpN6_ILr`LXVV|lNvYpWO_S^e4@ z+_T}_yIst|C`C3&iR}8Mk@~}9 zxH@zx@pK#owcLIJC$lXtXHK2qba~!sfYfIP|tQW5rgLQQ<#h21wq= z`WxIuSY78{0C66AKmk&@gcK-o^DuU}-*j-Rv>fu92(Q$$cip&jC;xzj=%3150?6~m zrFHZc4jFP^C>(tkz*znOg3Oh(Qez58UKxhYELWUA8dmHuzJAmz$tl?hO1GpF9sg=( zS~6wXG>Gub6o#ypzqT`?9-wIMO#BSvP7u-PXOGzbjBV8FBcFi$s4YDIGQ+rBTccjV z3U4zls_=#U)o;1Mt?hH2Z$YPgAMc!iBpAIkIVCAnXG_cBtvLjVmB|%Nt z+h}w--@~ZRdC)CYufYL`26y>ysSH0_;s5{!YDq*vRKUpNbfQzMAyBObh;e|jes0Ta zVw{~5Kork0_d$s{_X2M0JCG-vQ(Fx~ifXLgWZ3`RV7}pthH)O*uv>MWU;3TP=Gik^KE3dv++tzhsm|pM@fcO9a*r)VF zH4aTKNCe_(^MQMY3r5j4xTajxY<%;vYU!)00wg;Hah0=OBX%R^SD&pxso!ul)QC=H zo(E3FG3&z8bRZ0$xo{I{5Od^f5Yt~5L%%QNpH(eNu|9&32c8@Z%(?( zFjkZ;bc~l7EwPzZNf>fG-L(d9g0VB7ToU3OV1!-?P!fpjShY>XU0Mx}G%lPf4f7|% zVt;k$n6BG{5tjSm*8UrM2%*Ygca+F!^rfF{3XRxD_pJ_@*3~t}jd!OHS5cyB0m(kv za)(;I9m)Ib#Z#np>stX2SzZ%+=C#p6;YY`9dO0+EyAR(R=z(~4M^`c*Zogy2|fk) zEf_qfsE#MM#E*QKjL5dyS#44`d$NQBKI!Jwzb|YZ_a%Vu5pfJG z3JMXeL@*nk(hb#C?E;WMqtDNnfGqh|SZY3R7~d%G_gpH_ar*=yz59Og=ERBkme_y5 zt$V5h9iD=As8f6+8a?I5RQ}8qSji~})^Kw@fY~C^Ni7&NudjN}>0&;R>u!R5w-&!A za1Yybn*l)OO9UdhCGjOyh6>Uu4{I~3d@+89S?QlJj9Xq*8T-JWeF~6Xf3Evhd?{iq zKa1`^-5YxJxTWTx6yxBQ-slfUesHHO%LixGxe{${mgtm5Y+Lc|>S0#J@Ge}zt&53e zuDu;o2G)sV6qwsq6D`(B?A`!fLAJ24~B&|+M3OZ-)wF(b;gNT+e6kHMvs;w%B-~Vk z;mQX5@LABB2B-s-F^*h(l+v;HV7>Oe0N^fccZi+b3}AuFLl^e&Meq@SBt9t5)4&~F zhPhrLqX*v;{C?PqeAB4Cb`uWllf*mP=V{Y-dzK_@xy&>NF9hJG@`k*Jr(8$eS2`w! z&FJ66Gt~Jy;z&Pk&4tv1CTP(!R=p)50Mi0U)t6i?EY%W%j%H$OVHqqg(So#LG5`d^ z(t+;EAAp5buT)y_0U<`$IEik2GywCVoLvyXeX9PlybiZs?^KJKiFOb19taXCObS^hrKs z0ui9e0Fn_#8mJz})b(HwT#6mzaaZR1$JrH-P=Lq%X?=dGP9j>J2hQvj;`NoD>y`A% z>LRK<&ru!&@6n_u18l(6`sBMr=6|I zzQp->xR>IQ9_zQpH2^8X{Q%V?Kz?v)KqBzKCq`8s!3L0d$5{^n@8M48>rP=>s|JL> z2f&OK>~U~iTD>BvdUcLEhnK_93ubZt5t_*_8>UbBBVr(6YEL|xuz>VGstvd9-OqGl z%OMVzLmV!LzB%0kg62j5iqG)D9!~dzRdYgSQ=Ddi2d=A&D(Ol)M|d;hhcEth;qzRnP^wb2t$wIg0-r-uCk~Ho8BTY*#E$?@qRh##%Kd*W~7J6J;e!q5>JD6NxMdOoP+h}qOw<#1( zG?AksDya$Fs|hHq2S>D#*6UdrZX8@U4)DeJ6D!^aIBtgnX&bJ!&7I_In{wcp<^8Bn ep_|ypj{Sc`PVY-)GpCLK0000 Date: Thu, 10 Jan 2019 07:41:41 +0100 Subject: [PATCH 12/36] Result of build script --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a3b3624..3312cc5 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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://busterlabs.github.io/Partyshare) - A simple file sharing desktop app. +- [Partyshare](https://busterlabs.github.io/Partyshare) - A simple file sharing desktop app. [Source](https://github.com/BusterLabs/Partyshare) - [Pathephone](https://pathephone.github.io) - Distributed music streaming app. - [Peer Bandwidth Demo](https://ipfs.io/ipfs/QmVaVXbLdw4R5NqAiiQoTWtitxo5g7FS31PQmCLbH9p8Fu/) - An demo app that uses window.ipfs, provided by the IPFS Companion web extension to get and graph bandwidth info for your IPFS node [Source](https://github.com/tableflip/ipfs-peer-bw-example) - [Peer Map Demo](https://ipfs.io/ipfs/QmRPGCmLKH2dQmNiPRsiuYS9EhhJL1Gmkz5F75gKY1K4Bm/) - A map of IPv4 IPFS peers that uses window.ipfs [Source](https://github.com/tableflip/ipfs-peer-map-example) From 91a4707f14b673bb1118037518fadad5e5d662a8 Mon Sep 17 00:00:00 2001 From: Rico Gardaphe Date: Thu, 24 Jan 2019 09:38:33 -0500 Subject: [PATCH 13/36] Update apps.yaml (#232) --- data/apps.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/apps.yaml b/data/apps.yaml index 863e721..bab5208 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -166,7 +166,7 @@ content: website: https://qri.io source: https://github.com/qri-io/qri description: > - Dataset creation, collaboration, and discovery on the distributed web. + Dataset verion control, discovery and collaboration tools (free, open-source). - title: ujo website: http://ujomusic.com/ description: > From 9a0d0eb48142da69ea2ca28ee9eff813baf5bf91 Mon Sep 17 00:00:00 2001 From: Chris Waring Date: Thu, 14 Feb 2019 13:30:15 +0000 Subject: [PATCH 14/36] add google analytics --- src/layouts/_default/baseof.html | 1 + src/layouts/partials/analytics.html | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 src/layouts/partials/analytics.html diff --git a/src/layouts/_default/baseof.html b/src/layouts/_default/baseof.html index 875a157..a8dc4c1 100644 --- a/src/layouts/_default/baseof.html +++ b/src/layouts/_default/baseof.html @@ -2,6 +2,7 @@ {{ partial "head" . }} + {{ partial "analytics" . }} diff --git a/src/layouts/partials/analytics.html b/src/layouts/partials/analytics.html new file mode 100644 index 0000000..07529de --- /dev/null +++ b/src/layouts/partials/analytics.html @@ -0,0 +1,8 @@ + + + \ No newline at end of file From 6416172d1b217847135295dda91789c39e27b41e Mon Sep 17 00:00:00 2001 From: Chris Waring Date: Thu, 14 Feb 2019 14:19:13 +0000 Subject: [PATCH 15/36] do not track localhost activity --- src/layouts/partials/analytics.html | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/layouts/partials/analytics.html b/src/layouts/partials/analytics.html index 07529de..566b7de 100644 --- a/src/layouts/partials/analytics.html +++ b/src/layouts/partials/analytics.html @@ -1,8 +1,10 @@ \ No newline at end of file + if (location.hostname !== 'localhost') { + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', 'UA-96910779-8'); + } + From ff441d80de6d2b86f2a25079751e3ed82e65d143 Mon Sep 17 00:00:00 2001 From: meehow Date: Thu, 14 Feb 2019 16:54:52 +0100 Subject: [PATCH 16/36] added 2read.net (#235) * npm run build:readme without any changes * added 2read --- README.md | 5 ++- data/apps.yaml | 7 ++++ src/static/images/2read.svg | 83 +++++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/static/images/2read.svg diff --git a/README.md b/README.md index 3cd1ced..616c882 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el ## Apps +- [2read](https://2read.net/) - Convert article in current tab to readable form and upload it to writable node(s). [Source](https://github.com/meehow/2read) - [3Box](https://3box.io) - Create and manage your Ethereum Profile, and your personal data. Use the 3box-js library to integrate profiles into your dapp. [Source](https://github.com/uport-project/3box) - [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) @@ -86,7 +87,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [Playback](https://mafintosh.github.io/playback/) - IPFS playback support. This allows casting a video in IPFS to a Chromecast. - [PubSub Chat Demo](https://ipfs.io/ipfs/QmWZ3u5S7RjFXKfW6dSZhj7CozcvpqJxm48RYMmKkWcmNQ/) - A ~76KB demo chat app that uses window.ipfs, provided by the IPFS Companion web extension [Source](https://github.com/tableflip/ipfs-pubsub-chat-example) - [PushToTalk](http://timothy.hobbs.cz/push-to-talk/index.html) - Push to Talk lets you edit audio essays and publish them with IPFS. -- [qri](https://qri.io) - Dataset creation, collaboration, and discovery on the distributed web. [Source](https://github.com/qri-io/qri) +- [qri](https://qri.io) - Dataset verion control, discovery and collaboration tools (free, open-source). [Source](https://github.com/qri-io/qri) - [Request Network](https://request.network/) - Decentralized network for financial transactions. [Source](https://github.com/RequestNetwork/requestNetwork) - [TallyLab](https://tallylab.com/) - Local-first, end-to-end encrypted diary app for capturing, analyzing, and sharing data about any and everything. - [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 @@ -103,6 +104,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - 2017-08-21: [Understanding the IPFS White Paper part 2](https://decentralized.blog/understanding-the-ipfs-white-paper-part-2.html) - 2017-08-10: [Understanding the IPFS White Paper part 1](https://decentralized.blog/understanding-the-ipfs-white-paper-part-1.html) - 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-05-05: [Decentralized indexes for public genomic data](https://github.com/luizirber/2017-recomb) - 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) @@ -112,7 +114,6 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - 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) -- [Downloading nodejs versions with nvm/n over IPFS](https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmUx363UFtgiQqkHHsPK3TSDmwoALDo2hrbMWbcxjH2vFc) ## Datasets diff --git a/data/apps.yaml b/data/apps.yaml index bab5208..5ca271a 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -3,6 +3,13 @@ color: aqua icon: stroke_marketing description: Applications built with IPFS or with functionality that uses IPFS. content: + - title: 2read + website: https://2read.net/ + source: https://github.com/meehow/2read + picture: /images/2read.svg + description: > + Convert article in current tab to readable form and upload it + to writable node(s). - title: killcord website: https://killcord.io/ source: https://github.com/nomasters/killcord diff --git a/src/static/images/2read.svg b/src/static/images/2read.svg new file mode 100644 index 0000000..9830a57 --- /dev/null +++ b/src/static/images/2read.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2180b730a1caa9896c4999914efdfc0e9315e038 Mon Sep 17 00:00:00 2001 From: Chris Waring Date: Thu, 14 Feb 2019 20:40:35 +0000 Subject: [PATCH 17/36] respect dnt settings and track outbound clicks --- src/layouts/partials/analytics.html | 72 ++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/src/layouts/partials/analytics.html b/src/layouts/partials/analytics.html index 566b7de..c34ba14 100644 --- a/src/layouts/partials/analytics.html +++ b/src/layouts/partials/analytics.html @@ -1,10 +1,70 @@ - From 112d4033e85489881c2aa92984a6ebccf1d6e07f Mon Sep 17 00:00:00 2001 From: Miguel Mota Date: Fri, 22 Feb 2019 02:52:18 -0800 Subject: [PATCH 18/36] add IPDR --- README.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 616c882..5f50032 100644 --- a/README.md +++ b/README.md @@ -99,21 +99,21 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el ## Articles -- 2018-08-06: [Content Identifiers in IPFS](https://pascalprecht.github.io/posts/content-identifiers-in-ipfs/) -- 2018-07-11: [On future-proof cryptographic hashes](https://pascalprecht.github.io/posts/future-proofed-hashes-with-multihash/) -- 2017-08-21: [Understanding the IPFS White Paper part 2](https://decentralized.blog/understanding-the-ipfs-white-paper-part-2.html) -- 2017-08-10: [Understanding the IPFS White Paper part 1](https://decentralized.blog/understanding-the-ipfs-white-paper-part-1.html) -- 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-05-05: [Decentralized indexes for public genomic data](https://github.com/luizirber/2017-recomb) -- 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/blog/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) +- 2018-08-06: [Content Identifiers in IPFS](https://pascalprecht.github.io/posts/content-identifiers-in-ipfs/) +- 2018-07-11: [On future-proof cryptographic hashes](https://pascalprecht.github.io/posts/future-proofed-hashes-with-multihash/) +- 2017-08-21: [Understanding the IPFS White Paper part 2](https://decentralized.blog/understanding-the-ipfs-white-paper-part-2.html) +- 2017-08-10: [Understanding the IPFS White Paper part 1](https://decentralized.blog/understanding-the-ipfs-white-paper-part-1.html) +- 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-05-05: [Decentralized indexes for public genomic data](https://github.com/luizirber/2017-recomb) +- 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/blog/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) ## Datasets @@ -154,11 +154,12 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [ipscend](https://github.com/diasdavid/ipscend) - Tool for hosting web apps and static websites in IPFS - [pinbot](https://github.com/whyrusleeping/pinbot) - Pin content via IRC - [Siderus Orion](https://orion.siderus.io) - Easy to use IPFS desktop client for macOS, Windows and Linux [Source](https://github.com/Siderus/Orion) +- [IPDR](https://github.com/miguelmota/ipdr) - IPFS-backed Docker Registry ## Videos - [Distributed Apps with IPFS - Juan Benet at Fullstack Fest 2016](https://www.youtube.com/watch?v=jONZtXMu03w) - This talk breaks down how to build a dynamic app on top of IPFS with CRDTs, pub/sub, and slick UIs. It also delves into new models for distributed computation, and the ethical importance of distributing the web. -- [IPFS Alpha - Why we must redistribute the web](https://www.youtube.com/watch?v=skMTdSEaCtA) +- [IPFS Alpha - Why we must redistribute the web](https://www.youtube.com/watch?v=skMTdSEaCtA) - [IPFS Simply Explained](https://www.youtube.com/watch?v=5Uj6uR3fp-U) - Let's take a look at how IPFS works, how it can solve issue's like censorship and if it would really work across multiple planets! - [Juan Benet at Stanford 2015](https://www.youtube.com/watch?v=HUVmypx9HGI) - The talk includes a broad look at The IPFS Project, and a discussion on evolving the network stack through open source protocols R & D. - [Textile Build Series - A Free Online Workshop](https://www.youtube.com/playlist?list=PLC8CEtJ9shDznO1tpvGe--BVEWmCKY9_Z) - A full Training Program to teach devs on how to build for the Decentralized Web. The series covers a ton of content, touch multiple parts of the IPFS stack and guides devs through building a simple DApp. From 6c814f58476fbc9d5da20401a919563e746f3bbe Mon Sep 17 00:00:00 2001 From: Adam Uhlir Date: Thu, 14 Mar 2019 14:26:42 -0700 Subject: [PATCH 19/36] Adding ipfs-publish --- README.md | 3 ++- data/tools.yaml | 7 ++++++- src/static/images/ipfs-publish.png | Bin 0 -> 8860 bytes 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 src/static/images/ipfs-publish.png diff --git a/README.md b/README.md index 616c882..df99318 100644 --- a/README.md +++ b/README.md @@ -139,12 +139,13 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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-common](https://github.com/arsyun) - some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. [Source](https://github.com/arsyun/ipfs-common) +- [ipfs-common](https://github.com/arsyun) - Some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. [Source](https://github.com/arsyun/ipfs-common) - [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-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-publish](https://ipfs-publish.uhlir.dev) - Continuous Delivery tool for delivery of static websites from Git providers to IPFS. [Source](https://github.com/AuHau/ipfs-publish) - [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 diff --git a/data/tools.yaml b/data/tools.yaml index df16037..d644fbd 100644 --- a/data/tools.yaml +++ b/data/tools.yaml @@ -97,4 +97,9 @@ content: website: https://github.com/arsyun source: https://github.com/arsyun/ipfs-common description: > - some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. + Some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. +- title: ipfs-publish + picture: /images/ipfs-publish.png + website: https://ipfs-publish.uhlir.dev + source: https://github.com/AuHau/ipfs-publish + description: Continuous Delivery tool for delivery of static websites from Git providers to IPFS. diff --git a/src/static/images/ipfs-publish.png b/src/static/images/ipfs-publish.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf2995af6fe63b2a63d71acdef508e5744f3549 GIT binary patch literal 8860 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 U8r=`W6($HO3L5g&vf%Ll1D90l<^TWy literal 0 HcmV?d00001 From 57191b80db7401b1cbdb2467c909b6f48ab35834 Mon Sep 17 00:00:00 2001 From: Javi Date: Mon, 1 Apr 2019 02:05:56 +0200 Subject: [PATCH 20/36] Add tool to check public gateways states (#242) --- README.md | 1 + data/tools.yaml | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 616c882..22d0468 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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 - [pinbot](https://github.com/whyrusleeping/pinbot) - Pin content via IRC +- [Public gateway status checker](https://ipfs.fooock.com/) - Web app to check public states of IPFS gateways, including latency and gateway writable state. [Source](https://github.com/fooock/ipfs-gateway-checker) - [Siderus Orion](https://orion.siderus.io) - Easy to use IPFS desktop client for macOS, Windows and Linux [Source](https://github.com/Siderus/Orion) ## Videos diff --git a/data/tools.yaml b/data/tools.yaml index df16037..12d2c86 100644 --- a/data/tools.yaml +++ b/data/tools.yaml @@ -98,3 +98,7 @@ content: source: https://github.com/arsyun/ipfs-common description: > some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. +- title: Public gateway status checker + website: https://ipfs.fooock.com/ + source: https://github.com/fooock/ipfs-gateway-checker + description: Web app to check public states of IPFS gateways, including latency and gateway writable state. From 225e574fbfd4a54702edc066b1be568341c1dbac Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Mon, 29 Apr 2019 21:51:54 +0100 Subject: [PATCH 21/36] feat: update xkcd archive (#243) License: MIT Signed-off-by: Henrique Dias --- README.md | 4 ++-- data/datasets.yml | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 22d0468..4b717a2 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,6 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - 2017-08-21: [Understanding the IPFS White Paper part 2](https://decentralized.blog/understanding-the-ipfs-white-paper-part-2.html) - 2017-08-10: [Understanding the IPFS White Paper part 1](https://decentralized.blog/understanding-the-ipfs-white-paper-part-1.html) - 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-05-05: [Decentralized indexes for public genomic data](https://github.com/luizirber/2017-recomb) - 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) @@ -114,6 +113,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - 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) +- [Downloading nodejs versions with nvm/n over IPFS](https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmUx363UFtgiQqkHHsPK3TSDmwoALDo2hrbMWbcxjH2vFc) ## Datasets @@ -123,7 +123,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [Old Internet Files](https://ipfs.io/ipfs/QmbsZEvJE8EU51HCUHQg2aem9JNFmFHdva3tGVYutdCXHp) [Source](https://github.com/ipfs/archives/issues/176) - [Presidental Daily Briefs](https://ipfs.io/ipfs/Qme6epvZDj3vzHcFKdF1nZhbixjw8Bn4imGcKnbUyBJL89) [Source](https://github.com/ipfs/archives/issues/23) - [World Wide Web History Project](https://ipfs.io/ipfs/QmRTSA1UFHSx3z7taNRwUVM8AjB2EQwKvyZu3BfJg9QRtZ) [Source](https://github.com/ipfs/archives/issues/159) -- [XKCD](https://ipfs.io/ipfs/Qmb8wsGZNXt5VXZh1pEmYynjB6Euqpq3HYyeAdw2vScTkQ) [Source](https://github.com/ipfs/archives/issues/21) +- [XKCD](https://ipfs.io/ipns/xkcd.hacdias.com) [Source](https://github.com/ipfs/archives/issues/21) - [yarchive.net](https://ipfs.io/ipfs/QmdA5WkDNALetBn4iFeSepHjdLGJdxPBwZyY47ir1bZGAK) [Source](https://github.com/ipfs/archives/issues/76) ## Tools diff --git a/data/datasets.yml b/data/datasets.yml index 5f2c775..cd1e134 100644 --- a/data/datasets.yml +++ b/data/datasets.yml @@ -15,11 +15,11 @@ content: description: size: 480MB - title: XKCD - hash: /ipfs/Qmb8wsGZNXt5VXZh1pEmYynjB6Euqpq3HYyeAdw2vScTkQ - website: https://ipfs.io/ipfs/Qmb8wsGZNXt5VXZh1pEmYynjB6Euqpq3HYyeAdw2vScTkQ + hash: /ipns/xkcd.hacdias.com + website: https://ipfs.io/ipns/xkcd.hacdias.com source: https://github.com/ipfs/archives/issues/21 description: - size: 122MB + size: 241MB - title: Old Internet Files hash: /ipfs/QmbsZEvJE8EU51HCUHQg2aem9JNFmFHdva3tGVYutdCXHp website: https://ipfs.io/ipfs/QmbsZEvJE8EU51HCUHQg2aem9JNFmFHdva3tGVYutdCXHp From b4cb8c2ccd1ed8c48e5e8cea67c68a22174ee62f Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 30 Apr 2019 09:43:17 +0100 Subject: [PATCH 22/36] fix: remove non-existing (#245) * fix: remove non-existing License: MIT Signed-off-by: Henrique Dias * fix: remove failing demo License: MIT Signed-off-by: Henrique Dias --- README.md | 9 ++------- data/apps.yaml | 13 ------------- data/articles.yaml | 3 --- data/datasets.yml | 6 ------ data/tools.yaml | 2 +- 5 files changed, 3 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 4b717a2..3fc47b3 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,6 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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. - [Autonomica "IPFS Social Proof"](https://github.com/IBM/ipfs-social-proof) - Autonomica is a Keybase-like Dapp for creating an identity and proving this identity via published social media and web proofs. - [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. @@ -49,11 +48,10 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [dtube](https://d.tube) - Distributed video sharing with steem.it intergrations, using ipfs for backend storage. - [enzypt.io](https://enzypt.io/) - A website to buy and sell files through Ethereum and IPFS. [Source](https://github.com/flex-dapps/enzypt) - [Ethlance](http://ethlance.com) - First completely decentralised job market platform built on Ethereum and IPFS. [Source](https://github.com/madvas/ethlance) -- [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) +- [Gorilla REPL viewer](https://github.com/keorn/ipfs-gorilla-repl) - Gorilla is a rich REPL for Clojure in the notebook style. - [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) - [HydrusNetwork](https://github.com/hydrusnetwork/hydrus) - A booru-style media tagging application with a multitude of features, recently added basic ipfs support. @@ -71,7 +69,6 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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 Steem - [killcord](https://killcord.io/) - A censorship resistant deadman's switch [Source](https://github.com/nomasters/killcord) - [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. @@ -108,7 +105,6 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - 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/blog/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/) @@ -121,7 +117,6 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [IETF RFC Archive](https://ipfs.io/ipfs/QmNvTjdqEPjZVWCvRWsFJA1vK7TTw1g9JP6we1WBJTRADM) [Source](https://github.com/ipfs/archives/issues/18) - [MDSConnect](https://ipfs.io/ipfs/QmcvfB6pAqUfTnuAK8zFKVxbdhopnBPveJrDcy1JAA7HX5) [Source](https://github.com/ipfs/archives/issues/152) - [Old Internet Files](https://ipfs.io/ipfs/QmbsZEvJE8EU51HCUHQg2aem9JNFmFHdva3tGVYutdCXHp) [Source](https://github.com/ipfs/archives/issues/176) -- [Presidental Daily Briefs](https://ipfs.io/ipfs/Qme6epvZDj3vzHcFKdF1nZhbixjw8Bn4imGcKnbUyBJL89) [Source](https://github.com/ipfs/archives/issues/23) - [World Wide Web History Project](https://ipfs.io/ipfs/QmRTSA1UFHSx3z7taNRwUVM8AjB2EQwKvyZu3BfJg9QRtZ) [Source](https://github.com/ipfs/archives/issues/159) - [XKCD](https://ipfs.io/ipns/xkcd.hacdias.com) [Source](https://github.com/ipfs/archives/issues/21) - [yarchive.net](https://ipfs.io/ipfs/QmdA5WkDNALetBn4iFeSepHjdLGJdxPBwZyY47ir1bZGAK) [Source](https://github.com/ipfs/archives/issues/76) @@ -130,7 +125,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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 -- [dillo-ipfs](https://ipfs.io/ipns/12D3KooWBG1fsFRF4ykpidXVNVnbon5KLfv67pkkGeFstrwftVVb/) - IPFS integration for the Dillo web browser. [Source](https://git.scuttlebot.io/%25C35b%2BMlZ%2Fy5TT1e7SG66eNKEIdX5DRl9PRUxbhvO89k%3D.sha256) +- [dillo-ipfs](https://git.scuttlebot.io/%25C35b%2BMlZ%2Fy5TT1e7SG66eNKEIdX5DRl9PRUxbhvO89k%3D.sha256) - IPFS integration for the Dillo web browser. - [gatsby-plugin-ipfs](https://github.com/moxystudio/gatsby-plugin-ipfs) - Adds support for deploying Gatsby websites to IPFS by ensuring that assets are relative. - [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. diff --git a/data/apps.yaml b/data/apps.yaml index 5ca271a..ff8f991 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -138,10 +138,6 @@ content: source: https://github.com/victorbjelkholm/ipfsbin description: > Pastebin clone build. - - title: IPFSStore - website: https://ipfsstore.it - description: > - Pinning paid with Steem - title: markup.rocks website: https://ipfs.io/ipfs/QmWPgJnUGLB1LPh9KMG9LEN4LVu5e17TwkEtcmTWdNn9V6/#/ipfs/QmfQ75DjAxYzxMP2hdm6o4wFwZS5t7uorEZ2pX9AKXEg2u source: https://github.com/davidar/markup.rocks @@ -157,10 +153,6 @@ content: website: https://partysha.re description: > A simple file sharing app. - - 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: > @@ -204,7 +196,6 @@ content: 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 @@ -216,10 +207,6 @@ content: - 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: TallyLab website: https://tallylab.com/ picture: /images/tallylab.jpg diff --git a/data/articles.yaml b/data/articles.yaml index 661b589..d219960 100644 --- a/data/articles.yaml +++ b/data/articles.yaml @@ -24,9 +24,6 @@ content: - 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/blog/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 diff --git a/data/datasets.yml b/data/datasets.yml index cd1e134..4cd0474 100644 --- a/data/datasets.yml +++ b/data/datasets.yml @@ -8,12 +8,6 @@ content: website: https://ipfs.io/ipfs/QmNvTjdqEPjZVWCvRWsFJA1vK7TTw1g9JP6we1WBJTRADM source: https://github.com/ipfs/archives/issues/18 size: 500MB - - title: Presidental Daily Briefs - hash: /ipfs/Qme6epvZDj3vzHcFKdF1nZhbixjw8Bn4imGcKnbUyBJL89 - website: https://ipfs.io/ipfs/Qme6epvZDj3vzHcFKdF1nZhbixjw8Bn4imGcKnbUyBJL89 - source: https://github.com/ipfs/archives/issues/23 - description: - size: 480MB - title: XKCD hash: /ipns/xkcd.hacdias.com website: https://ipfs.io/ipns/xkcd.hacdias.com diff --git a/data/tools.yaml b/data/tools.yaml index 12d2c86..2ab7362 100644 --- a/data/tools.yaml +++ b/data/tools.yaml @@ -11,7 +11,7 @@ content: description: Adds support for deploying Gatsby websites to IPFS by ensuring that assets are relative. - title: dillo-ipfs source: https://git.scuttlebot.io/%25C35b%2BMlZ%2Fy5TT1e7SG66eNKEIdX5DRl9PRUxbhvO89k%3D.sha256 - website: https://ipfs.io/ipns/12D3KooWBG1fsFRF4ykpidXVNVnbon5KLfv67pkkGeFstrwftVVb/ + website: https://git.scuttlebot.io/%25C35b%2BMlZ%2Fy5TT1e7SG66eNKEIdX5DRl9PRUxbhvO89k%3D.sha256 description: IPFS integration for the Dillo web browser. picture: /images/dillo-ipfs.png - title: git-remote-ipfs From 5a3a3e5f38ae3d82c81cbc25e2f8bca80d0d6971 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 30 Apr 2019 13:33:54 +0100 Subject: [PATCH 23/36] chore: move to Circle CI and fix deploy (#244) License: MIT Signed-off-by: Henrique Dias --- .circleci/config.yml | 47 ++++++++++++++++++++++++++++++++++ ci/Jenkinsfile | 4 --- src/layouts/partials/list.html | 3 ++- 3 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 .circleci/config.yml delete mode 100644 ci/Jenkinsfile diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..266a179 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,47 @@ +version: 2 +jobs: + build: + docker: + - image: circleci/node:10.15.1-browsers + environment: + NO_SANDBOX: true + steps: + - checkout + - run: npm install + - run: npm run build + - persist_to_workspace: + root: . + paths: + - public + + deploy: + docker: + - image: olizilla/ipfs-dns-deploy + environment: + DOMAIN: awesome.ipfs.io + BUILD_DIR: public + steps: + - attach_workspace: + at: /tmp/workspace + - run: + name: Deploy website to IPFS + command: | + pin_name="$DOMAIN build $CIRCLE_BUILD_NUMBER" + + hash=$(pin-to-cluster.sh "$pin_name" /tmp/workspace/$BUILD_DIR) + + echo "Website added to IPFS: https://ipfs.io/ipfs/$hash" + + if [ "$CIRCLE_BRANCH" == "master" ] ; then + dnslink-dnsimple -d $DOMAIN -r _dnslink -l /ipfs/$hash + fi + +workflows: + version: 2 + build-deploy: + jobs: + - build + - deploy: + context: ipfs-dns-deploy + requires: + - build diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile deleted file mode 100644 index ef1e8bc..0000000 --- a/ci/Jenkinsfile +++ /dev/null @@ -1,4 +0,0 @@ -website([ - website: 'awesome.ipfs.io', - record: '_dnslink' -]) diff --git a/src/layouts/partials/list.html b/src/layouts/partials/list.html index 8bfa17e..aa09419 100644 --- a/src/layouts/partials/list.html +++ b/src/layouts/partials/list.html @@ -45,7 +45,8 @@ From 9544b76bbe3168ab0ab45aa397dfb37013c15ddb Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 30 Apr 2019 15:04:20 +0100 Subject: [PATCH 24/36] chore: remove travis and just use circle (#246) License: MIT Signed-off-by: Henrique Dias --- .circleci/config.yml | 19 +++++++++++++++++++ .travis.yml | 7 ------- 2 files changed, 19 insertions(+), 7 deletions(-) delete mode 100644 .travis.yml diff --git a/.circleci/config.yml b/.circleci/config.yml index 266a179..727ad0f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,5 +1,13 @@ version: 2 jobs: + awesome: + docker: + - image: circleci/ruby:2.4.2-jessie-node + steps: + - checkout + - run: gem install awesome_bot + - run: awesome_bot --allow-redirect --allow-dupe --allow-ssl -w ipfs.io README.md + build: docker: - image: circleci/node:10.15.1-browsers @@ -38,8 +46,19 @@ jobs: workflows: version: 2 + check-links: + triggers: + - schedule: + cron: "0 0 * * *" + filters: + branches: + only: + - master + jobs: + - awesome build-deploy: jobs: + - awesome - build - deploy: context: ipfs-dns-deploy diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index cd3108b..0000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: ruby -rvm: - - 2.2 -before_script: - - gem install awesome_bot -script: - - awesome_bot --allow-redirect --allow-dupe --allow-ssl README.md From 6f15e77ed672bd081fdde1fe7ba5f8e6b6c35332 Mon Sep 17 00:00:00 2001 From: Daniel Aleksandersen Date: Tue, 30 Apr 2019 16:04:47 +0200 Subject: [PATCH 25/36] Add Eternum.io (#229) --- README.md | 1 + data/apps.yaml | 5 +++++ src/static/images/eternum.png | Bin 0 -> 46908 bytes 3 files changed, 6 insertions(+) create mode 100644 src/static/images/eternum.png diff --git a/README.md b/README.md index 3fc47b3..6183b05 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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. - [enzypt.io](https://enzypt.io/) - A website to buy and sell files through Ethereum and IPFS. [Source](https://github.com/flex-dapps/enzypt) +- [Eternum](https://www.eternum.io/) - Paid pinning service with an easy-to-use API. - [Ethlance](http://ethlance.com) - First completely decentralised job market platform built on Ethereum and IPFS. [Source](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. diff --git a/data/apps.yaml b/data/apps.yaml index ff8f991..6986bcf 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -73,6 +73,11 @@ content: description: > Distributed video sharing with steem.it intergrations, using ipfs for backend storage. + - title: Eternum + website: https://www.eternum.io/ + picture: /images/eternum.png + description: > + Paid pinning service with an easy-to-use API. - title: Ethlance website: http://ethlance.com source: https://github.com/madvas/ethlance diff --git a/src/static/images/eternum.png b/src/static/images/eternum.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5e67b68cbee54fba2f6c26869f84d8013099b9 GIT binary patch literal 46908 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

kmb=W3f$AWLRsya8Z+&#IEJi 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 Date: Tue, 30 Apr 2019 17:35:30 +0100 Subject: [PATCH 26/36] feat: clean up (a lot) (#247) License: MIT Signed-off-by: Henrique Dias --- .gitignore | 2 - Makefile | 6 -- package.json | 34 ++++---- scripts/data.js | 29 +++++-- scripts/make-data.js | 138 +++++++------------------------ scripts/make-readme.js | 10 +-- scripts/utils.js | 5 +- src/layouts/_default/baseof.html | 15 ++-- src/layouts/_default/list.html | 9 -- src/layouts/_default/single.html | 3 + src/layouts/index.html | 8 +- src/layouts/partials/list.html | 119 +++++++++++++------------- 12 files changed, 141 insertions(+), 237 deletions(-) delete mode 100644 Makefile delete mode 100644 src/layouts/_default/list.html create mode 100644 src/layouts/_default/single.html diff --git a/.gitignore b/.gitignore index 6789b40..3a106de 100644 --- a/.gitignore +++ b/.gitignore @@ -27,9 +27,7 @@ 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/Makefile b/Makefile deleted file mode 100644 index b9a954c..0000000 --- a/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -build: - npm --version - node --version - npm install - npm run lint - npm run build \ No newline at end of file diff --git a/package.json b/package.json index 4de646d..f2ebcee 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "1.0.0", "private": true, "dependencies": { - "ipfs-css": "^0.5.2", - "lunr": "^2.3.0", - "tachyons": "^4.10.0" + "ipfs-css": "^0.12.0", + "lunr": "^2.3.6", + "tachyons": "^4.11.1" }, "scripts": { "start": "node ./scripts/dev.js", @@ -18,24 +18,22 @@ "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" + "build:hugo": "hugo -s src -d ../public --cleanDestinationDir --minify --gc" }, "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", + "babel-eslint": "^10.0.1", + "browserify": "^16.2.3", + "chokidar": "^2.1.5", + "cssnano": "^4.1.10", + "ecstatic": "^4.1.2", + "fs-extra": "^7.0.1", + "hugo-bin": "^0.43.4", + "node-yaml": "^3.2.0", + "npm-run-all": "^4.1.5", + "postcss-cli": "^6.1.2", + "postcss-import": "^12.0.1", "shx": "^0.3.2", - "standard": "^11.0.1", + "standard": "^12.0.1", "uglifyify": "^5.0.1", "watch": "^1.0.2" }, diff --git a/scripts/data.js b/scripts/data.js index 6b6932d..6965e32 100644 --- a/scripts/data.js +++ b/scripts/data.js @@ -1,23 +1,34 @@ const fs = require('fs') -const path = require('path') +const { join } = require('path') const yaml = require('node-yaml') -const { sortAbc } = require('./utils') -const dataDir = path.join(__dirname, '../data') +const { sortAbc, sortInv, slugify } = require('./utils') +const dir = join(__dirname, '../data') const trimIfExists = (str) => str ? str.trim() : undefined -const files = fs.readdirSync(dataDir) - .map(file => path.join(dataDir, file)) +module.exports = fs.readdirSync(dir) + .map(file => join(dir, file)) .map(file => yaml.readSync(file)) .map(file => { - file.content = file.content.map(({ title, description, ...file }) => ({ + file.slug = slugify(file.title) + file.type = 'category' + + file.content = file.content.map(({ title, description, ...meta }, i) => ({ + ...meta, title: trimIfExists(title), description: trimIfExists(description), - ...file + category: file.slug, + color: file.color, + index: i })) + let sort = (a, b) => sortAbc(a.title, b.title) + + if (file.slug === 'articles') { + sort = (a, b) => sortInv(a.date, b.date) + } + + file.content = file.content.sort(sort) return file }) .sort((a, b) => sortAbc(a.title, b.title)) - -module.exports = files diff --git a/scripts/make-data.js b/scripts/make-data.js index 967e70e..9a8ff93 100644 --- a/scripts/make-data.js +++ b/scripts/make-data.js @@ -1,126 +1,50 @@ const lunr = require('lunr') const fs = require('fs-extra') -const path = require('path') -const { slugify, capitalize, sortAbc } = require('./utils') +const { join } = require('path') -const dataDir = path.join(__dirname, '../src/data') -const contentDir = path.join(__dirname, '../src/content') -const indexesDir = path.join(__dirname, '../src/layouts/partials/indexes') +function getData () { + let data = require('./data') -const processDataType = (data) => { - const content = data.content.map(info => { - const { website, ...more } = info - - return { - website: website, - categories: [data.title.toLowerCase()], - ...more - } + data.push({ + title: 'Awesome IPFS', + slug: '_index', + content: data + .reduce((arr, cat) => arr.concat(cat.content), []) + .map((el, i) => ({ + ...el, + index: i + })) }) - delete data.content - - return { - info: { ...data }, - content: content - } + data.forEach(makeIndex) + return data } -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 = []}) => ({ +function makeIndex (category) { + const data = category.content.map(({ index, title, description = '', tags = [], category = '' }) => ({ ref: index, - data: `${title} ${description} ${tags.join(' ')} ${categories.join(' ')}` + data: `${title} ${description} ${tags.join(' ')} ${category}` })) - 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, ``) - } + category.index = lunr(function () { + this.ref('ref') + this.field('data') + data.forEach(this.add.bind(this)) + }) } const process = () => { - fs.ensureDirSync(dataDir) - fs.ensureDirSync(contentDir) - fs.ensureDirSync(indexesDir) - fs.emptyDirSync(dataDir) - fs.emptyDirSync(contentDir) - fs.emptyDirSync(indexesDir) + const dir = join(__dirname, '../src/content') + fs.ensureDirSync(dir) + fs.emptyDirSync(dir) - let data = [] - let types = [] - let typesObj = {} + const data = getData() - 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)) + for (const { index, slug, ...meta } of data) { + const filename = join(dir, slug + '.md') + fs.writeFileSync(filename, `${JSON.stringify(meta)} +`) + } } process() diff --git a/scripts/make-readme.js b/scripts/make-readme.js index 9aae10e..34b5179 100644 --- a/scripts/make-readme.js +++ b/scripts/make-readme.js @@ -3,18 +3,12 @@ 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 { slugify } = 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 => { + const content = category.content.map(item => { let block = '- ' let mainUrl = '' diff --git a/scripts/utils.js b/scripts/utils.js index 72bd658..3573363 100644 --- a/scripts/utils.js +++ b/scripts/utils.js @@ -20,12 +20,9 @@ const slugify = (text) => text.toString() .replace(/^-+/, '') .replace(/-+$/, '') -const capitalize = (text) => `${text.charAt(0).toUpperCase()}${text.slice(1).toLowerCase()}` - module.exports = { sort, sortInv, sortAbc, - slugify, - capitalize + slugify } diff --git a/src/layouts/_default/baseof.html b/src/layouts/_default/baseof.html index 875a157..ed673f5 100644 --- a/src/layouts/_default/baseof.html +++ b/src/layouts/_default/baseof.html @@ -11,15 +11,12 @@ IPFS

Awesome IPFS

- - {{ $site := .Site }} - {{ range $name, $taxonomy := .Site.Taxonomies.categories }} - {{ $color := (index $site.Data.categories $name).color }} - {{ $icon := print (index $site.Data.categories $name).icon ".svg" }} - - {{ partial (print "icons/" $icon ) }} - {{ $name }} + + {{ range (where .Site.Pages "Type" "category") }} + + {{ partial (print "icons/" .Params.icon ".svg" ) }} + {{ .Title }} {{ end }} diff --git a/src/layouts/_default/list.html b/src/layouts/_default/list.html deleted file mode 100644 index 913007d..0000000 --- a/src/layouts/_default/list.html +++ /dev/null @@ -1,9 +0,0 @@ -{{ 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/single.html b/src/layouts/_default/single.html new file mode 100644 index 0000000..c9f00c1 --- /dev/null +++ b/src/layouts/_default/single.html @@ -0,0 +1,3 @@ +{{ define "main" }} +{{ partial "list" . }} +{{ end }} diff --git a/src/layouts/index.html b/src/layouts/index.html index 265d3a0..c9f00c1 100644 --- a/src/layouts/index.html +++ b/src/layouts/index.html @@ -1,7 +1,3 @@ -{{ define "main" }} - -{{ partial "list" .Pages }} -{{ partial "indexes/index" }} - +{{ define "main" }} +{{ partial "list" . }} {{ end }} - diff --git a/src/layouts/partials/list.html b/src/layouts/partials/list.html index aa09419..3952728 100644 --- a/src/layouts/partials/list.html +++ b/src/layouts/partials/list.html @@ -12,74 +12,75 @@
- {{ range (sort . "Params.index") -}} -
- {{ $cat := index .Params.categories 0 }} - {{ $color := (index .Site.Data.categories $cat).color }} -
- {{ humanize $cat }} + {{ range (sort .Params.content "index") -}} +
+
+ {{ humanize .category }} +
+ +
+ -
- + {{- if isset . "date" -}} + {{ template "text" dateFormat "January 2, 2006" .date }} + {{- end -}} - {{- if isset .Params "date" -}} - {{ template "text" .Date.Format "January 2, 2006" }} - {{- end -}} + {{- if isset . "description" -}} + {{ template "text" .description }} + {{- end -}} - {{- if isset .Params "description" -}} - {{ template "text" .Params.description }} - {{- end -}} + {{- if isset . "size" -}} + {{ template "text" (print "Size: " .size) }} + {{- end -}} - {{- if isset .Params "size" -}} - {{ template "text" (print "Size: " .Params.size) }} - {{- end -}} - - {{- if isset .Params "hash" -}} - - {{- end -}} - - {{- if isset .Params "picture" -}} + {{- if isset . "hash" -}} - {{ end }} + {{- 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 -}} -
+ {{- if isset . "picture" -}} + -
+ {{ end }} + +
+ {{- if isset . "website" -}} + + {{ partial "icons/globe.svg" }} + + {{- end -}} + + {{- if isset . "source" -}} + + {{ partial "icons/code.svg" }} + + {{- end -}} + + {{- if isset . "demo" -}} + + {{ partial "icons/flask.svg" }} + + {{- end -}} +
+ +
+
{{ end }}
+ +{{ .Content }} \ No newline at end of file From 469716e832b6c25409a4b0beedb00ecddabd2325 Mon Sep 17 00:00:00 2001 From: CHEVALAY JOSSELIN Date: Tue, 30 Apr 2019 18:56:27 +0200 Subject: [PATCH 27/36] feat: add ipfscloud --- data/apps.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/data/apps.yaml b/data/apps.yaml index 2037c75..b050fb0 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -305,6 +305,11 @@ content: Run your IPFS node on your machine without having to bother with command line tools. Manage your node, add your files, easily change the settings... everything from just one interface. + - title: IpfsCloud + source: https://github.com/cluster-labs/ipfscloud-web + website: https://ipfscloud.store + description: > + A Decentralized, Anonymous Cloud Storage Platform on IPFS. - title: 3Box website: https://3box.io source: https://github.com/uport-project/3box From 00e80cca664699d6c8673cfc12e6028e1528b6b9 Mon Sep 17 00:00:00 2001 From: Romaric Juniet Date: Wed, 1 May 2019 00:57:44 +0800 Subject: [PATCH 28/36] feat: update Request after rebranding (#238) --- README.md | 2 +- data/apps.yaml | 6 +++--- src/static/images/request-network.png | Bin 53672 -> 0 bytes src/static/images/request.svg | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) delete mode 100644 src/static/images/request-network.png create mode 100644 src/static/images/request.svg diff --git a/README.md b/README.md index a1a8f18..0032e3d 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - [PushToTalk](http://timothy.hobbs.cz/push-to-talk/index.html) - Push to Talk lets you edit audio essays and publish them with IPFS. - [qri](https://qri.io) - Dataset verion control, discovery and collaboration tools (free, open-source). [Source](https://github.com/qri-io/qri) - [Request Network](https://request.network/) - Decentralized network for financial transactions. [Source](https://github.com/RequestNetwork/requestNetwork) -- [TallyLab](https://tallylab.com/) - Local-first, end-to-end encrypted data diary app for capturing, analyzing, and sharing data about any and everything. +- [TallyLab](https://tallylab.com/) - Local-first, end-to-end encrypted diary app for capturing, analyzing, and sharing data about any and everything. - [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) - [ToDo List Demo](https://ipfs.io/ipfs/QmfFaH6dGibQ5JwEdsujeHBzsmHUsFRB5kU9P8nzPyzMv2/) - A ToDo List demo app that uses windows.ipfs. [Source](https://github.com/ipfs-shipyard/demo-ipfs-todo) diff --git a/data/apps.yaml b/data/apps.yaml index b050fb0..f0f8a2c 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -325,9 +325,9 @@ content: source: https://github.com/amar-laksh/xfce-screenshooter-ipfs-support description: > A fork of xfce-screenshooter with IPFS support! - - title: Request Network + - title: Request website: https://request.network/ source: https://github.com/RequestNetwork/requestNetwork - picture: /images/request-network.png + picture: /images/request.svg description: > - Decentralized network for financial transactions. + The open network for transaction requests. diff --git a/src/static/images/request-network.png b/src/static/images/request-network.png deleted file mode 100644 index 6959bd5658a1caeb4bfd1bf1c7f48346de4b174f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53672 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

Jg<=I2c;`y}hJLT2GM-J8 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

*M-f>Nyi-{vFZf-h>kV$j9`w6^zkVK$f(6 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 diff --git a/src/static/images/request.svg b/src/static/images/request.svg new file mode 100644 index 0000000..76cf70f --- /dev/null +++ b/src/static/images/request.svg @@ -0,0 +1 @@ +Artboard 1 \ No newline at end of file From 7a505b3b6b4f72b3adad23bf20d9bae3f845d79b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Jeanmart?= Date: Tue, 30 Apr 2019 17:59:29 +0100 Subject: [PATCH 29/36] feat: Add Mahuta to the tools list (#219) --- README.md | 1 + data/tools.yaml | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 0032e3d..26c4c0a 100644 --- a/README.md +++ b/README.md @@ -149,6 +149,7 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - [IPLD Explorer](https://explore.ipld.io) - Explore the Merkle Forest from the comfort of your browser [Source](https://github.com/ipfs-shipyard/ipld-explorer) - [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 +- [mahuta](https://github.com/ConsenSys/Mahuta) - Mahuta is a plug and play service for your micro-service architecture allowing to collect, store and index data on IPFS and offering search functionalities (full text, query). - [pinbot](https://github.com/whyrusleeping/pinbot) - Pin content via IRC - [Public gateway status checker](https://ipfs.fooock.com/) - Web app to check public states of IPFS gateways, including latency and gateway writable state. [Source](https://github.com/fooock/ipfs-gateway-checker) - [Siderus Orion](https://orion.siderus.io) - Easy to use IPFS desktop client for macOS, Windows and Linux [Source](https://github.com/Siderus/Orion) diff --git a/data/tools.yaml b/data/tools.yaml index 32b134f..dfd0a57 100644 --- a/data/tools.yaml +++ b/data/tools.yaml @@ -101,6 +101,11 @@ content: source: https://github.com/arsyun/ipfs-common description: > some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. +- title: mahuta + website: https://github.com/ConsenSys/Mahuta + source: https://github.com/ConsenSys/Mahuta + description: > + Mahuta is a plug and play service for your micro-service architecture allowing to collect, store and index data on IPFS and offering search functionalities (full text, query). - title: Public gateway status checker website: https://ipfs.fooock.com/ source: https://github.com/fooock/ipfs-gateway-checker From e12658ed28e01490b3fa7f57ec3c2371277c5108 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 30 Apr 2019 18:04:23 +0100 Subject: [PATCH 30/36] feat: update readme --- README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a0dba61..c2a9fca 100644 --- a/README.md +++ b/README.md @@ -71,8 +71,8 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - [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 Steem -- [KDE-DolphinServiceMenu-IPFS](https://github.com/amar-laksh/KDE-DolphinServiceMenu-IPFS) - Service Menu for Dolphin File Manager to upload files to IPFS +- [IpfsCloud](https://ipfscloud.store) - A Decentralized, Anonymous Cloud Storage Platform on IPFS. [Source](https://github.com/cluster-labs/ipfscloud-web) +- [KDE-DolphinServiceMenu-IPFS](https://github.com/amar-laksh/KDE-DolphinServiceMenu-IPFS) - Service Menu for Dolphin File Manager to upload files to IPFS The open network for transaction requests. - [killcord](https://killcord.io/) - A censorship resistant deadman's switch [Source](https://github.com/nomasters/killcord) - [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. @@ -89,8 +89,8 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - [PubSub Chat Demo](https://ipfs.io/ipfs/QmWZ3u5S7RjFXKfW6dSZhj7CozcvpqJxm48RYMmKkWcmNQ/) - A ~76KB demo chat app that uses window.ipfs, provided by the IPFS Companion web extension [Source](https://github.com/tableflip/ipfs-pubsub-chat-example) - [PushToTalk](http://timothy.hobbs.cz/push-to-talk/index.html) - Push to Talk lets you edit audio essays and publish them with IPFS. - [qri](https://qri.io) - Dataset verion control, discovery and collaboration tools (free, open-source). [Source](https://github.com/qri-io/qri) -- [Request Network](https://request.network/) - Decentralized network for financial transactions. [Source](https://github.com/RequestNetwork/requestNetwork) -- [TallyLab](https://tallylab.com/) - Local-first, end-to-end encrypted diary app for capturing, analyzing, and sharing data about any and everything. +- [Request](https://request.network/) - Decentralized network for financial transactions. [Source](https://github.com/RequestNetwork/requestNetwork) +- [TallyLab](https://tallylab.com/) - Local-first, end-to-end encrypted data diary app for capturing, analyzing, and sharing data about any and everything. - [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) - [ToDo List Demo](https://ipfs.io/ipfs/QmfFaH6dGibQ5JwEdsujeHBzsmHUsFRB5kU9P8nzPyzMv2/) - A ToDo List demo app that uses windows.ipfs. [Source](https://github.com/ipfs-shipyard/demo-ipfs-todo) @@ -105,7 +105,6 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - 2017-08-21: [Understanding the IPFS White Paper part 2](https://decentralized.blog/understanding-the-ipfs-white-paper-part-2.html) - 2017-08-10: [Understanding the IPFS White Paper part 1](https://decentralized.blog/understanding-the-ipfs-white-paper-part-1.html) - 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-05-05: [Decentralized indexes for public genomic data](https://github.com/luizirber/2017-recomb) - 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) @@ -114,6 +113,7 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - 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) +- [Downloading nodejs versions with nvm/n over IPFS](https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmUx363UFtgiQqkHHsPK3TSDmwoALDo2hrbMWbcxjH2vFc) ## Datasets @@ -144,7 +144,7 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - [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-publish](https://ipfs-publish.uhlir.dev) - Continuous Delivery tool for delivery of static websites from Git providers to IPFS. [Source](https://github.com/AuHau/ipfs-publish) +- [ipfs-publish](https://ipfs-publish.uhlir.dev) - Continuous Delivery tool for delivery of static websites from Git providers to IPFS. some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. [Source](https://github.com/AuHau/ipfs-publish) - [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 @@ -156,13 +156,12 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - [pinbot](https://github.com/whyrusleeping/pinbot) - Pin content via IRC - [Public gateway status checker](https://ipfs.fooock.com/) - Web app to check public states of IPFS gateways, including latency and gateway writable state. [Source](https://github.com/fooock/ipfs-gateway-checker) - [Siderus Orion](https://orion.siderus.io) - Easy to use IPFS desktop client for macOS, Windows and Linux [Source](https://github.com/Siderus/Orion) -- [IPDR](https://github.com/miguelmota/ipdr) - IPFS-backed Docker Registry - [Sweet IPFS](https://github.com/RHazDev/Sweet-IPFS) - Full node for Android ## Videos - [Distributed Apps with IPFS - Juan Benet at Fullstack Fest 2016](https://www.youtube.com/watch?v=jONZtXMu03w) - This talk breaks down how to build a dynamic app on top of IPFS with CRDTs, pub/sub, and slick UIs. It also delves into new models for distributed computation, and the ethical importance of distributing the web. -- [IPFS Alpha - Why we must redistribute the web](https://www.youtube.com/watch?v=skMTdSEaCtA) +- [IPFS Alpha - Why we must redistribute the web](https://www.youtube.com/watch?v=skMTdSEaCtA) - [IPFS Simply Explained](https://www.youtube.com/watch?v=5Uj6uR3fp-U) - Let's take a look at how IPFS works, how it can solve issue's like censorship and if it would really work across multiple planets! - [Juan Benet at Stanford 2015](https://www.youtube.com/watch?v=HUVmypx9HGI) - The talk includes a broad look at The IPFS Project, and a discussion on evolving the network stack through open source protocols R & D. - [Textile Build Series - A Free Online Workshop](https://www.youtube.com/playlist?list=PLC8CEtJ9shDznO1tpvGe--BVEWmCKY9_Z) - A full Training Program to teach devs on how to build for the Decentralized Web. The series covers a ton of content, touch multiple parts of the IPFS stack and guides devs through building a simple DApp. From 2dc0450f64cd485f6166911ac30a97f9d839f2f3 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 30 Apr 2019 18:20:48 +0100 Subject: [PATCH 31/36] feat: re-add makefile License: MIT Signed-off-by: Henrique Dias --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..97e2b9f --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +build: + npm --version + node --version + npm install + npm run lint + npm run build From 8e2d327b524c7351b7907326328a2326c916299f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Uhl=C3=AD=C5=99?= Date: Tue, 30 Apr 2019 11:04:01 -0700 Subject: [PATCH 32/36] Fixing description of ipfs-publish --- data/tools.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/data/tools.yaml b/data/tools.yaml index 9e084f0..bf61283 100644 --- a/data/tools.yaml +++ b/data/tools.yaml @@ -106,7 +106,6 @@ content: website: https://ipfs-publish.uhlir.dev source: https://github.com/AuHau/ipfs-publish description: Continuous Delivery tool for delivery of static websites from Git providers to IPFS. - some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. - title: mahuta website: https://github.com/ConsenSys/Mahuta source: https://github.com/ConsenSys/Mahuta From e7ba34ed840158f0b352fb34f534418260eef33e Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 30 Apr 2019 21:19:54 +0100 Subject: [PATCH 33/36] feat: re-add IPDR License: MIT Signed-off-by: Henrique Dias --- README.md | 1 + data/tools.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index c2a9fca..cbb80d9 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - [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. +- [IPDR](https://github.com/miguelmota/ipdr) - IPFS-backed Docker Registry - [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 diff --git a/data/tools.yaml b/data/tools.yaml index 9e084f0..c53865e 100644 --- a/data/tools.yaml +++ b/data/tools.yaml @@ -116,3 +116,6 @@ content: website: https://ipfs.fooock.com/ source: https://github.com/fooock/ipfs-gateway-checker description: Web app to check public states of IPFS gateways, including latency and gateway writable state. +- title: IPDR + website: https://github.com/miguelmota/ipdr + description: IPFS-backed Docker Registry From eda45f2d4440a180b1b15cd9d1ae99b3161af024 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 30 Apr 2019 22:15:54 +0100 Subject: [PATCH 34/36] feat: add discussify and airsecure License: MIT Signed-off-by: Henrique Dias --- README.md | 4 +++- data/apps.yaml | 13 +++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cbb80d9..04f6faf 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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) +- [AirSecure](https://github.com/airsecure/airsecure) - Decentralized two factor authentication app built on Textile & IPFS. - [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. @@ -45,6 +46,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [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. +- [Discussify](https://github.com/ipfs-shipyard/discussify-browser-extension) - Discussify provides a real-time, peer to peer, and permanent discussion platform for anyone to join and participate. - [dtube](https://d.tube) - Distributed video sharing with steem.it intergrations, using ipfs for backend storage. - [enzypt.io](https://enzypt.io/) - A website to buy and sell files through Ethereum and IPFS. [Source](https://github.com/flex-dapps/enzypt) - [Eternum](https://www.eternum.io/) - Paid pinning service with an easy-to-use API. @@ -65,7 +67,7 @@ Everyone is welcome to submit their new awesome-ipfs item. In order to add an el - [IPFS Event Drop](https://github.com/travisperson/ipfs-event-drops) - An app that allows for improved visualization of ipfs events. - [IPFS ID and Public Key QR Codes Demo](https://ipfs.io/ipfs/zdj7Whr8X3zah99TSuyPjENaERcBW9C7B36EaCb1DEZ5pbbL9/) - A demo app that uses windows.ipfs to show you a QR Code of your IPNS Link and of your Public Key. [Source](https://github.com/ipfs-shipyard/demo-ipfs-id-qr-codes) - [ipfs-md-wiki](https://github.com/daijiale/ipfs-md-wiki) - Build your wiki system base on ipfs and markdown. -- [ipfs-search](https://ipfs-search.com) - Searching the universe since 2016. +- [ipfs-search](https://ipfs-search.com) - Searching the universe since 2016. Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search API's available. [Source](https://github.com/ipfs-search/ipfs-search) - [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) diff --git a/data/apps.yaml b/data/apps.yaml index 381bf25..4d95b84 100644 --- a/data/apps.yaml +++ b/data/apps.yaml @@ -131,8 +131,8 @@ content: website: https://ipfs-search.com source: https://github.com/ipfs-search/ipfs-search description: > - Searching the universe since 2016. - + Searching the universe since 2016. + Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search API's available. - title: ipfs-share source: https://github.com/rameshvarun/ipfs-share @@ -336,3 +336,12 @@ content: description: > Service Menu for Dolphin File Manager to upload files to IPFS The open network for transaction requests. + - title: Discussify + source: https://github.com/ipfs-shipyard/discussify-browser-extension + description: > + Discussify provides a real-time, peer to peer, and permanent discussion platform + for anyone to join and participate. + - title: AirSecure + source: https://github.com/airsecure/airsecure + description: > + Decentralized two factor authentication app built on Textile & IPFS. \ No newline at end of file From 0e255e7fdcb41416724dbfc641bb539b596c4132 Mon Sep 17 00:00:00 2001 From: Henrique Dias Date: Tue, 30 Apr 2019 22:18:20 +0100 Subject: [PATCH 35/36] feat: update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 04f6faf..e12802f 100644 --- a/README.md +++ b/README.md @@ -147,7 +147,7 @@ Sniffs the DHT gossip and indexes file and directory hashes. Metadata and search - [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-publish](https://ipfs-publish.uhlir.dev) - Continuous Delivery tool for delivery of static websites from Git providers to IPFS. some common tools, 1.CID to human readable cid, 2.cid and block name convert, 3. read the leveldb tools. [Source](https://github.com/AuHau/ipfs-publish) +- [ipfs-publish](https://ipfs-publish.uhlir.dev) - Continuous Delivery tool for delivery of static websites from Git providers to IPFS. [Source](https://github.com/AuHau/ipfs-publish) - [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 From 4b20b5b7b6291c534ae7791c7817386f565ec762 Mon Sep 17 00:00:00 2001 From: Oli Evans Date: Wed, 1 May 2019 09:55:38 +0100 Subject: [PATCH 36/36] chore: trigger ci --- src/layouts/_default/baseof.html | 1 - 1 file changed, 1 deletion(-) diff --git a/src/layouts/_default/baseof.html b/src/layouts/_default/baseof.html index a8dc4c1..d05e2c0 100644 --- a/src/layouts/_default/baseof.html +++ b/src/layouts/_default/baseof.html @@ -4,7 +4,6 @@ {{ partial "head" . }} {{ partial "analytics" . }} -