mirror of
https://github.com/ipfs/awesome-ipfs.git
synced 2024-08-22 10:15:45 +00:00
Merge branch 'master' into fix-partyshare-link
This commit is contained in:
commit
85ef98c88b
66
.circleci/config.yml
Normal file
66
.circleci/config.yml
Normal file
@ -0,0 +1,66 @@
|
||||
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
|
||||
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
|
||||
check-links:
|
||||
triggers:
|
||||
- schedule:
|
||||
cron: "0 0 * * *"
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
jobs:
|
||||
- awesome
|
||||
build-deploy:
|
||||
jobs:
|
||||
- awesome
|
||||
- build
|
||||
- deploy:
|
||||
context: ipfs-dns-deploy
|
||||
requires:
|
||||
- build
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -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
|
||||
|
@ -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
|
6
Makefile
6
Makefile
@ -1,6 +0,0 @@
|
||||
build:
|
||||
npm --version
|
||||
node --version
|
||||
npm install
|
||||
npm run lint
|
||||
npm run build
|
24
README.md
24
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)
|
||||
@ -35,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.
|
||||
@ -47,12 +47,12 @@ 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)
|
||||
- [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.
|
||||
@ -65,12 +65,12 @@ 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.
|
||||
- [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.
|
||||
@ -86,9 +86,9 @@ 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.
|
||||
- [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)
|
||||
@ -103,16 +103,15 @@ 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)
|
||||
- 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)
|
||||
- [Downloading nodejs versions with nvm/n over IPFS](https://ipfs.io/ipfs/QmTkzDwWqPbnAh5YiV5VwcTLnGdwSNsNTn2aDxdXBFca7D/example#/ipfs/QmUx363UFtgiQqkHHsPK3TSDmwoALDo2hrbMWbcxjH2vFc)
|
||||
|
||||
## Datasets
|
||||
|
||||
@ -120,16 +119,15 @@ 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/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
|
||||
|
||||
- [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.
|
||||
@ -152,7 +150,9 @@ 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)
|
||||
- [Sweet IPFS](https://github.com/RHazDev/Sweet-IPFS) - Full node for Android
|
||||
|
||||
## Videos
|
||||
|
||||
|
4
ci/Jenkinsfile
vendored
4
ci/Jenkinsfile
vendored
@ -1,4 +0,0 @@
|
||||
website([
|
||||
website: 'awesome.ipfs.io',
|
||||
record: '_dnslink'
|
||||
])
|
@ -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
|
||||
@ -66,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
|
||||
@ -116,9 +128,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: >
|
||||
@ -131,10 +146,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
|
||||
@ -152,10 +163,6 @@ content:
|
||||
picture: /images/Partyshare_Logo.png
|
||||
description: >
|
||||
A simple file sharing desktop 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: >
|
||||
@ -168,7 +175,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: >
|
||||
@ -199,7 +206,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
|
||||
@ -211,15 +217,11 @@ 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
|
||||
description: >
|
||||
Local-first, end-to-end encrypted diary app for capturing, analyzing, and sharing data about any and everything.
|
||||
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: >
|
||||
|
@ -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
|
||||
|
@ -8,18 +8,12 @@ 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: /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
|
||||
|
@ -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
|
||||
@ -11,7 +14,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
|
||||
@ -98,3 +101,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.
|
||||
|
34
package.json
34
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"
|
||||
},
|
||||
|
@ -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
|
||||
|
@ -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, `<script>var idx = JSON.parse(\`${json}\`);</script>`)
|
||||
}
|
||||
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)}
|
||||
<script>var idx = JSON.parse(\`${JSON.stringify(index).replace(`'`, `\\'`)}\`);</script>`)
|
||||
}
|
||||
}
|
||||
|
||||
process()
|
||||
|
@ -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 = ''
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -12,14 +12,11 @@
|
||||
<h1 class="f3 white">Awesome IPFS</h1>
|
||||
</a>
|
||||
|
||||
{{ $site := .Site }}
|
||||
{{ range $name, $taxonomy := .Site.Taxonomies.categories }}
|
||||
{{ $color := (index $site.Data.categories $name).color }}
|
||||
{{ $icon := print (index $site.Data.categories $name).icon ".svg" }}
|
||||
<a href="/categories/{{ $name | urlize }}"
|
||||
class="flex-grow-1 flex items-center justify-center white no-underline pa2 bg-animate dib bg-{{ $color }}-muted hover-bg-{{ $color }}">
|
||||
<span class="w2 h2 fill-white mr2">{{ partial (print "icons/" $icon ) }}</span>
|
||||
{{ $name }}
|
||||
{{ range (where .Site.Pages "Type" "category") }}
|
||||
<a href="{{ .RelPermalink }}"
|
||||
class="flex-grow-1 flex items-center justify-center white no-underline pa2 bg-animate dib bg-{{ .Params.color }}-muted hover-bg-{{ .Params.color }}">
|
||||
<span class="w2 h2 fill-white mr2">{{ partial (print "icons/" .Params.icon ".svg" ) }}</span>
|
||||
{{ .Title }}
|
||||
</a>
|
||||
{{ end }}
|
||||
</nav>
|
||||
|
@ -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 }}
|
3
src/layouts/_default/single.html
Normal file
3
src/layouts/_default/single.html
Normal file
@ -0,0 +1,3 @@
|
||||
{{ define "main" }}
|
||||
{{ partial "list" . }}
|
||||
{{ end }}
|
@ -1,7 +1,3 @@
|
||||
{{ define "main" }}
|
||||
|
||||
{{ partial "list" .Pages }}
|
||||
{{ partial "indexes/index" }}
|
||||
|
||||
{{ partial "list" . }}
|
||||
{{ end }}
|
||||
|
||||
|
@ -12,73 +12,75 @@
|
||||
</div>
|
||||
|
||||
<main class="CardContainer mv4 flex flex-wrap justify-between" >
|
||||
{{ range (sort . "Params.index") -}}
|
||||
<article data-ref="{{ .Params.index }}" class="Card flex flex-column bg-white shadow-4 grow2 br1 dark-gray b--black-10 flex-grow-1 ma2">
|
||||
{{ $cat := index .Params.categories 0 }}
|
||||
{{ $color := (index .Site.Data.categories $cat).color }}
|
||||
<div class="bg-navy ttu fw6 tracked montserrat bg-{{ $color }}-muted br1 br--top white pv1 ph2 ph3-ns f7 b w-100">
|
||||
{{ humanize $cat }}
|
||||
{{ range (sort .Params.content "index") -}}
|
||||
<article data-ref="{{ .index }}" class="Card flex flex-column bg-white shadow-4 grow2 br1 dark-gray b--black-10 flex-grow-1 ma2">
|
||||
<div class="bg-navy ttu fw6 tracked montserrat bg-{{ .color }}-muted br1 br--top white pv1 ph2 ph3-ns f7 b w-100">
|
||||
{{ humanize .category }}
|
||||
</div>
|
||||
|
||||
<div class="pa2 ph3-ns pb3-ns flex flex-column flex-grow-1">
|
||||
<div class="dt w-100 mt1">
|
||||
<div class="dtc">
|
||||
<a target="_blank" class="no-underline charcoal" href="{{ if .website }}{{ .website }}{{ else if .source }}{{ .source }}{{ else if .demo }}{{ .demo }}{{ end }}">
|
||||
<h1 class="f5 mw5 f4-ns mv0">{{- .title -}}</h1>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pa2 ph3-ns pb3-ns flex flex-column flex-grow-1">
|
||||
<div class="dt w-100 mt1">
|
||||
<div class="dtc">
|
||||
<a target="_blank" class="no-underline charcoal" href="{{ if .Params.website }}{{ .Params.website }}{{ else if .Params.source }}{{ .Params.source }}{{ else if .Params.demo }}{{ .Params.demo }}{{ end }}">
|
||||
<h1 class="f5 mw5 f4-ns mv0">{{- .Title -}}</h1>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{{- 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" -}}
|
||||
<div class="mt2 mw5">
|
||||
<a href="https://ipfs.io{{ .Params.hash }}" target="_blank" alt="Website" title="Website" class="aqua hover-teal">
|
||||
<abbr title="{{ .Params.hash }}">
|
||||
<code>{{ substr .Params.hash 0 10 }}...{{ substr .Params.hash 47 5 }}</code>
|
||||
</abbr>
|
||||
</a>
|
||||
</div>
|
||||
{{- end -}}
|
||||
|
||||
{{- if isset .Params "picture" -}}
|
||||
{{- if isset . "hash" -}}
|
||||
<div class="mt2 mw5">
|
||||
<a target="_blank" class="no-underline charcoal" href="{{ if .Params.website }}{{ .Params.website }}{{ else if .Params.source }}{{ .Params.source }}{{ else if .Params.demo }}{{ .Params.demo }}{{ end }}">
|
||||
<img class="br2" src="{{ .Site.BaseURL }}{{ .Params.picture }}" >
|
||||
<a href="https://ipfs.io{{ .hash }}" target="_blank" alt="Website" title="Website" class="aqua hover-teal">
|
||||
<abbr title="{{ .hash }}">
|
||||
{{ $length := sub (len .hash) 5 }}
|
||||
<code>{{ substr .hash 0 10 }}...{{ substr .hash $length 5 }}</code>
|
||||
</abbr>
|
||||
</a>
|
||||
</div>
|
||||
{{ end }}
|
||||
{{- end -}}
|
||||
|
||||
<div class="flex pt2 mt-auto align-center justify-begin">
|
||||
{{- if isset .Params "website" -}}
|
||||
<a href="{{ .Params.website }}" target="_blank" alt="Website" title="Website">
|
||||
{{ partial "icons/globe.svg" }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
|
||||
{{- if isset .Params "source" -}}
|
||||
<a href="{{ .Params.source }}" target="_blank" alt="Source Code" title="Source Code">
|
||||
{{ partial "icons/code.svg" }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
|
||||
{{- if isset .Params "demo" -}}
|
||||
<a href="{{ .Params.demo }}" target="_blank" alt="Demo" title="Demo">
|
||||
{{ partial "icons/flask.svg" }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
</div>
|
||||
{{- if isset . "picture" -}}
|
||||
<div class="mt2 mw5">
|
||||
<a target="_blank" class="no-underline charcoal" href="{{ if .website }}{{ .website }}{{ else if .source }}{{ .source }}{{ else if .demo }}{{ .demo }}{{ end }}">
|
||||
<img class="br2" src="{{ .picture | relURL }}" >
|
||||
</a>
|
||||
</div>
|
||||
</article>
|
||||
{{ end }}
|
||||
|
||||
<div class="flex pt2 mt-auto align-center justify-begin">
|
||||
{{- if isset . "website" -}}
|
||||
<a href="{{ .website }}" target="_blank" alt="Website" title="Website">
|
||||
{{ partial "icons/globe.svg" }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
|
||||
{{- if isset . "source" -}}
|
||||
<a href="{{ .source }}" target="_blank" alt="Source Code" title="Source Code">
|
||||
{{ partial "icons/code.svg" }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
|
||||
{{- if isset . "demo" -}}
|
||||
<a href="{{ .demo }}" target="_blank" alt="Demo" title="Demo">
|
||||
{{ partial "icons/flask.svg" }}
|
||||
</a>
|
||||
{{- end -}}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</article>
|
||||
{{ end }}
|
||||
</main>
|
||||
|
||||
{{ .Content }}
|
83
src/static/images/2read.svg
Normal file
83
src/static/images/2read.svg
Normal file
@ -0,0 +1,83 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="13.520844mm" height="13.520844mm" viewBox="0 0 47.908501 47.908501" id="svg2" version="1.1" inkscape:version="0.91 r13725" sodipodi:docname="Button - Share.svg" inkscape:export-filename="/Users/jgillanders/Development/Games/Colibrium/Pictures/Button - Share.png" inkscape:export-xdpi="961.83002" inkscape:export-ydpi="961.83002">
|
||||
<defs id="defs4">
|
||||
<marker inkscape:isstock="true" inkscape:stockid="DistanceStart" orient="auto" refY="0" refX="0" id="DistanceStart" style="overflow:visible">
|
||||
<g id="g2300">
|
||||
<path id="path2306" d="M 0,0 2,0" style="fill:none;stroke:#ffffff;stroke-width:1.14999998;stroke-linecap:square" inkscape:connector-curvature="0"/>
|
||||
<path id="path2302" d="M 0,0 13,4 9,0 13,-4 0,0 Z" style="fill:#000000;fill-rule:evenodd;stroke:none" inkscape:connector-curvature="0"/>
|
||||
<path id="path2304" d="M 0,-4 0,40" style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:square" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</marker>
|
||||
<linearGradient x1="14.66" y1="7.0243001" x2="24.031" gradientUnits="userSpaceOnUse" y2="34.826" id="G3">
|
||||
<stop offset="0" stop-color="#fcf9fb" id="s3"/>
|
||||
<stop offset="1" stop-opacity="0" stop-color="#fcf9fb" id="s4"/>
|
||||
</linearGradient>
|
||||
<radialGradient fy="32.797306" fx="28.935429" r="22" gradientTransform="matrix(1,-0.2,0.2,1,-3.8,6.8)" cx="28.935429" cy="32.797306" gradientUnits="userSpaceOnUse" id="R0">
|
||||
<stop offset="0" stop-color="#e6cf00" id="s1"/>
|
||||
<stop offset="1" stop-color="#fde94a" id="s2"/>
|
||||
</radialGradient>
|
||||
<radialGradient r="9.6875" gradientTransform="matrix(2.4,0,0,0.67,-17.1,22.4)" cx="17.312" cy="25.531" gradientUnits="userSpaceOnUse" id="R1">
|
||||
<stop offset="0" stop-opacity=".63" id="s5"/>
|
||||
<stop offset="1" stop-opacity="0" id="s6"/>
|
||||
</radialGradient>
|
||||
<linearGradient gradientTransform="matrix(0.31170768,-0.14537193,0.14537193,0.31170768,-216.07743,565.35148)" y2="34.826" x2="24.031" y1="7.0243001" x1="14.66" gradientUnits="userSpaceOnUse" id="linearGradient2995" xlink:href="#G3" inkscape:collect="always"/>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient3011" xlink:href="#R0" inkscape:collect="always"/>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient3018-9" xlink:href="#R0-4" inkscape:collect="always"/>
|
||||
<radialGradient fy="32.797306" fx="28.935429" r="22" gradientTransform="matrix(1,-0.2,0.2,1,-3.8,6.8)" cx="28.935429" cy="32.797306" gradientUnits="userSpaceOnUse" id="R0-4">
|
||||
<stop offset="0" stop-color="#e6cf00" id="s1-8"/>
|
||||
<stop offset="1" stop-color="#fde94a" id="s2-8"/>
|
||||
</radialGradient>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient3028-2" xlink:href="#R0-45" inkscape:collect="always"/>
|
||||
<radialGradient fy="32.797306" fx="28.935429" r="22" gradientTransform="matrix(1,-0.2,0.2,1,-3.8,6.8)" cx="28.935429" cy="32.797306" gradientUnits="userSpaceOnUse" id="R0-45">
|
||||
<stop offset="0" stop-color="#e6cf00" id="s1-5"/>
|
||||
<stop offset="1" stop-color="#fde94a" id="s2-1"/>
|
||||
</radialGradient>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient3986" xlink:href="#R0-45" inkscape:collect="always"/>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient3986-5" xlink:href="#R0-45-7" inkscape:collect="always"/>
|
||||
<radialGradient fy="32.797306" fx="28.935429" r="22" gradientTransform="matrix(1,-0.2,0.2,1,-3.8,6.8)" cx="28.935429" cy="32.797306" gradientUnits="userSpaceOnUse" id="R0-45-7">
|
||||
<stop offset="0" stop-color="#e6cf00" id="s1-5-6"/>
|
||||
<stop offset="1" stop-color="#fde94a" id="s2-1-1"/>
|
||||
</radialGradient>
|
||||
<radialGradient inkscape:collect="always" xlink:href="#R0-45-7" id="radialGradient4007" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" cx="28.935429" cy="32.797306" fx="28.935429" fy="32.797306" r="22"/>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient3986-5-2" xlink:href="#R0-45-7-7" inkscape:collect="always"/>
|
||||
<radialGradient fy="32.797306" fx="28.935429" r="22" gradientTransform="matrix(1,-0.2,0.2,1,-3.8,6.8)" cx="28.935429" cy="32.797306" gradientUnits="userSpaceOnUse" id="R0-45-7-7">
|
||||
<stop offset="0" stop-color="#e6cf00" id="s1-5-6-9"/>
|
||||
<stop offset="1" stop-color="#fde94a" id="s2-1-1-5"/>
|
||||
</radialGradient>
|
||||
<radialGradient inkscape:collect="always" xlink:href="#R0-45-7-7" id="radialGradient4041" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" cx="28.935429" cy="32.797306" fx="28.935429" fy="32.797306" r="22"/>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient4065" xlink:href="#R0-45" inkscape:collect="always"/>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient4065-4" xlink:href="#R0-45-3" inkscape:collect="always"/>
|
||||
<radialGradient fy="32.797306" fx="28.935429" r="22" gradientTransform="matrix(1,-0.2,0.2,1,-3.8,6.8)" cx="28.935429" cy="32.797306" gradientUnits="userSpaceOnUse" id="R0-45-3">
|
||||
<stop offset="0" stop-color="#e6cf00" id="s1-5-1"/>
|
||||
<stop offset="1" stop-color="#fde94a" id="s2-1-2"/>
|
||||
</radialGradient>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1.0439725,-0.20879451,0.20879451,1.0439725,-147.8058,553.72738)" gradientUnits="userSpaceOnUse" id="radialGradient4113" xlink:href="#R0-45-7-7" inkscape:collect="always"/>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(1,-0.2,0.2,1,78.2,6.8)" gradientUnits="userSpaceOnUse" id="radialGradient4117" xlink:href="#R0-45" inkscape:collect="always"/>
|
||||
<radialGradient r="22" fy="32.797306" fx="28.935429" cy="32.797306" cx="28.935429" gradientTransform="matrix(0.61925922,-1.4303233,1.4303233,0.61925922,-39.346374,44.502008)" gradientUnits="userSpaceOnUse" id="radialGradient4120" xlink:href="#R0-45" inkscape:collect="always"/>
|
||||
</defs>
|
||||
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="3.959798" inkscape:cx="21.898881" inkscape:cy="30.152565" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" fit-margin-top="0" fit-margin-left="0" fit-margin-right="0" fit-margin-bottom="0" inkscape:window-width="1440" inkscape:window-height="815" inkscape:window-x="0" inkscape:window-y="1" inkscape:window-maximized="1"/>
|
||||
<metadata id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(229.66854,-548.40793)">
|
||||
<path id="hl" d="m -206.82877,565.402 2.03199,0.91795 c 1.54237,0.71307 0.75483,0.33719 2.36782,1.12659 -4.12683,1.94063 -0.28812,2.61772 -4.43562,5.1369 l 0.0102,-0.70185 c 0.0502,-4.01163 -0.32955,1.92558 0.0256,-6.47959 z" style="opacity:0.8;fill:url(#linearGradient2995)" inkscape:connector-curvature="0" sodipodi:nodetypes="cccccc"/>
|
||||
<circle r="22.95425" cy="572.36218" cx="-205.71429" id="path3932" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:url(#radialGradient4113);fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"/>
|
||||
<circle r="20.743464" cy="572.36218" cx="-205.71429" style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:0.68999999;fill:none;stroke:#ffffff;stroke-width:2.53080082;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" id="path4067"/>
|
||||
<flowRoot style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:125%;font-family:Arial;-inkscape-font-specification:Arial;text-align:center;letter-spacing:2.72000003px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" id="flowRoot3379" xml:space="preserve" transform="translate(-229.71429,548.3622)"><flowRegion id="flowRegion3381"><rect style="font-size:22.5px" y="12.076912" x="10.03369" height="29.110088" width="28.986216" id="rect3383"/></flowRegion><flowPara id="flowPara3385"/></flowRoot> <g transform="matrix(0.03231979,0,0,0.03231979,-180.85582,575.47438)" id="layer1-2">
|
||||
<g transform="matrix(0,-17.254,17.254,0,10443,-2252.9)" id="g11676">
|
||||
<path transform="translate(1.1045,-949.48)" style="color:#000000" d="m -134.38,309.5 c 0,4.1683 -3.3791,7.5474 -7.5474,7.5474 -4.1683,0 -7.5474,-3.3791 -7.5474,-7.5474 0,-4.1683 3.3791,-7.5474 7.5474,-7.5474 4.1683,0 7.5474,3.3791 7.5474,7.5474 z" id="path11666" inkscape:connector-curvature="0"/>
|
||||
<path transform="translate(32.767,-949.48)" style="color:#000000" d="m -134.38,309.5 c 0,4.1683 -3.3791,7.5474 -7.5474,7.5474 -4.1683,0 -7.5474,-3.3791 -7.5474,-7.5474 0,-4.1683 3.3791,-7.5474 7.5474,-7.5474 4.1683,0 7.5474,3.3791 7.5474,7.5474 z" id="path11668" inkscape:connector-curvature="0"/>
|
||||
<path transform="translate(16.936,-976.35)" style="color:#000000" d="m -134.38,309.5 c 0,4.1683 -3.3791,7.5474 -7.5474,7.5474 -4.1683,0 -7.5474,-3.3791 -7.5474,-7.5474 0,-4.1683 3.3791,-7.5474 7.5474,-7.5474 4.1683,0 7.5474,3.3791 7.5474,7.5474 z" id="path11670" inkscape:connector-curvature="0"/>
|
||||
<rect x="488.22" y="-443.73001" width="27.691999" height="3" transform="matrix(0.49998488,-0.86603413,0.86603413,0.49998488,0,0)" style="color:#000000" id="rect11672"/>
|
||||
<rect x="613.15997" y="-226.89999" width="27.691999" height="3" transform="matrix(-0.5,-0.86603,-0.86603,0.5,0,0)" style="color:#000000" id="rect11674"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
BIN
src/static/images/eternum.png
Normal file
BIN
src/static/images/eternum.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
Loading…
Reference in New Issue
Block a user