diff --git a/docs/README.md b/docs/README.md index 09453e91b..102a0b553 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,7 +10,7 @@ description: The home page for developer documentation for IPFS, the InterPlanet No matter who you are or what you're creating, you can be part of the movement to create the next generation of the internet. This site contains everything you need to start building using the InterPlanetary File System (IPFS) and pave the way for the future Web. ::: -Check out some of the most popular content in these docs below — or explore the main site menu to learn about key concepts, try out how-to guides, see API and CLI references, or just install IPFS and get hacking. +Check out some of the most popular content in these docs below — or explore the main site menu to learn about [key concepts](concepts/README.md), try out [how-to guides](how-to/README.md), see [API and CLI references](reference/README.md), or just [install IPFS](install/README.md) and get hacking. ## Download IPFS tools @@ -24,17 +24,17 @@ These tools can help you use and build on IPFS more quickly and efficiently — Protect yourself from single-point-of-failure risks and benefit from decentralized infrastructure by hosting your static website using IPFS. If you're new to IPFS, this is an excellent place to start learning how to build on the decentralized web. -[Start the tutorial →](/how-to/websites-on-ipfs/single-page-website/) +[Start the tutorial →](how-to/websites-on-ipfs/single-page-website.md) ## Learn about the decentralized web Want to know more about the decentralized web (Dweb) and how it's changing the internet? These resources will give you a clearer understanding of the Dweb movement, and how it's improving the world: -- [What is IPFS](/concepts/what-is-ipfs/) -- [Peer-to-peer sharing](/concepts/dht/) -- [Content-addressed data](/concepts/content-addressing/) +- [What is IPFS](concepts/what-is-ipfs.md) +- [Peer-to-peer sharing](concepts/dht.md) +- [Content-addressed data](concepts/content-addressing.md) -[See more guides in the Concepts section →](/concepts/) +[See more guides in the Concepts section →](concepts/README.md) ::: callout ProtoSchool's self-guided [interactive tutorials](https://proto.school/tutorials) are designed to introduce you to decentralized web concepts, protocols, and tools. Explore js-ipfs APIs by completing browser-based coding challenges in ProtoSchool's [IPFS course](https://proto.school/course/ipfs), or explore code-free intros to essential dweb concepts and related projects in the IPFS ecosystem. @@ -50,6 +50,6 @@ Are you looking for inspiration? You can find a huge collection of awesome commu ## Be part of the IPFS community -IPFS has a bustling community of designers, developers, writers, and activists who are all helping to improve the project. You can join in by attending a local meetup, helping out at a conference, chatting online through [Matrix channels](/community/chat), or joining a discussion in [the IPFS forum](https://discuss.ipfs.io/). +IPFS has a bustling community of designers, developers, writers, and activists who are all helping to improve the project. You can join in by attending a local meetup, helping out at a conference, chatting online through [Matrix channels](community/chat.md), or joining a discussion in [the IPFS forum](https://discuss.ipfs.io/). -[Find out more in the Community section →](/community/) +[Find out more in the Community section →](community/README.md) diff --git a/docs/community/README.md b/docs/community/README.md index 1cbdc84b3..754d360b1 100644 --- a/docs/community/README.md +++ b/docs/community/README.md @@ -14,7 +14,7 @@ Sign up for the IPFS Weekly newsletter to get project updates, community news, e ## Ways to contribute -No matter your area of specialty or level of expertise, there are many [ways to contribute](/community/contribute/ways-to-contribute/) to IPFS and make a real difference in the IPFS community at large. +No matter your area of specialty or level of expertise, there are many [ways to contribute](contribute/ways-to-contribute.md) to IPFS and make a real difference in the IPFS community at large. ## IPFS forums @@ -22,7 +22,7 @@ The official [IPFS forums](https://discuss.ipfs.io/) are the primary home of IPF ## Chat -Casual chat fan? Here are [all our channels](/community/chat/). There's getting-started advice for you here, too. +Casual chat fan? Here are [all our channels](chat.md). There's getting-started advice for you here, too. ## ProtoSchool workshops @@ -34,7 +34,7 @@ IPFS meetups are also all over the world. [Find one close to you](https://www.me ## Social media -We're in a lot of places. Here's [how to find them all](social-media) for your favorite platforms. +We're in a lot of places. Here's [how to find them all](social-media.md) for your favorite platforms. ## Awesome IPFS diff --git a/docs/community/contribute/contribution-tutorial.md b/docs/community/contribute/contribution-tutorial.md index 6e5dcbcc9..264c246a9 100755 --- a/docs/community/contribute/contribution-tutorial.md +++ b/docs/community/contribute/contribution-tutorial.md @@ -5,7 +5,7 @@ description: Learn how to contribute to IPFS documentation through finding issue # Contribution tutorial -While the [grammar, formatting, and style](/community/contribute/grammar-formatting-and-style/) and the [writing guide](/community/contribute/writing-guide/) can both help you write good content for the IPFS Docs project, they don't delve into _how_ you can submit your content changes. This guide will walk you through finding an issue, fixing it, and then submitting your fix to the `ipfs/ipfs-docs` project. +While the [grammar, formatting, and style](grammar-formatting-and-style.md) and the [writing guide](writing-guide.md) can both help you write good content for the IPFS Docs project, they don't delve into _how_ you can submit your content changes. This guide will walk you through finding an issue, fixing it, and then submitting your fix to the `ipfs/ipfs-docs` project. There are plenty of small-sized issues around IPFS documentation that make for easy, helpful contributions to the IPFS project. Here, we'll walk through: diff --git a/docs/community/contribute/grammar-formatting-and-style.md b/docs/community/contribute/grammar-formatting-and-style.md index 6bd61adbe..6203a96ee 100755 --- a/docs/community/contribute/grammar-formatting-and-style.md +++ b/docs/community/contribute/grammar-formatting-and-style.md @@ -5,7 +5,7 @@ description: Learn the syntax and formatting rules for writing documentation for # Grammar, formatting, and style -This page details the syntax and formatting rules for writing IPFS documentation. For more conceptual ideas of writing, check out the [writing guide](/community/contribute/writing-guide/). +This page details the syntax and formatting rules for writing IPFS documentation. For more conceptual ideas of writing, check out the [writing guide](writing-guide.md). ## Grammar and spelling @@ -56,6 +56,10 @@ How the Markdown syntax looks, and code formatting rules to follow. The IPFS Docs project follows the _GitHub Flavored Markdown_ syntax for markdown. This way, all articles display properly within GitHub itself. This gives readers the option to view articles on [the docs website](https://docs.ipfs.io) or [its GitHub repo](https://github.com/ipfs/ipfs-docs). +#### Relative links + +If you include internal (relative) links to other content on the IPFS docs site, please link to them using full relative paths (e.g. use `../` for climbing a directory) and specifying the file's full name (e.g. `awesome-tutorial.md#subheading`). This ensures that users who read docs content directly in-repo on GitHub's web UI are able to follow relative links correctly. + ### Rules We use the rules set out in the [VSCode Markdownlint](https://github.com/DavidAnson/vscode-markdownlint) extension. You can import these rules into any text editor like Vim or Sublime. All rules are listed [within the Markdownlint repository](https://github.com/DavidAnson/markdownlint/blob/master/doc/Rules.md). diff --git a/docs/community/contribute/ways-to-contribute.md b/docs/community/contribute/ways-to-contribute.md index 4f1d4739b..c7ced3644 100644 --- a/docs/community/contribute/ways-to-contribute.md +++ b/docs/community/contribute/ways-to-contribute.md @@ -32,11 +32,11 @@ IPFS is a huge project and undertaking, and with lots of code comes the need for Before contributing to the IPFS docs, please read these quick guides; they'll save you time and help keep the docs accurate and consistent! -1. [Style and formatting guide](/community/contribute/grammar-formatting-and-style/) -2. [Writing guide](/community/contribute/writing-guide/) -3. [Code persona](/community/contribute/code-persona/) +1. [Style and formatting guide](grammar-formatting-and-style.md) +2. [Writing guide](writing-guide.md) +3. [Code persona](code-persona.md) -If you have never contributed to an open-source project before or just need a refresher, take a look at the [contribution tutorial](/community/contribute/contribution-tutorial/). +If you have never contributed to an open-source project before or just need a refresher, take a look at the [contribution tutorial](contribution-tutorial.md). ## Support diff --git a/docs/community/contribute/writing-guide.md b/docs/community/contribute/writing-guide.md index b5c83b871..8ca4fbf67 100755 --- a/docs/community/contribute/writing-guide.md +++ b/docs/community/contribute/writing-guide.md @@ -5,7 +5,7 @@ description: Learn the specifics of how to write documentation for the IPFS proj # Writing guide -This guide explains how to write an article. While the [grammar, formatting, and style guide](/community/contribute/grammar-formatting-and-style/) lets you know the rules you should follow, this guide will help you to properly structure your writing and choose the correct tone for your audience. +This guide explains how to write an article. While the [grammar, formatting, and style guide](grammar-formatting-and-style.md) lets you know the rules you should follow, this guide will help you to properly structure your writing and choose the correct tone for your audience. ## Walkthroughs diff --git a/docs/concepts/README.md b/docs/concepts/README.md index bb071fecc..2791d508b 100644 --- a/docs/concepts/README.md +++ b/docs/concepts/README.md @@ -28,57 +28,57 @@ Want the basics in theater mode? Check out these helpful videos for an overview Get the basic concepts of IPFS in one place, including: -- [What is IPFS?](/concepts/what-is-ipfs/) -- [How IPFS works](/concepts/how-ipfs-works/) +- [What is IPFS?](what-is-ipfs.md) +- [How IPFS works](how-ipfs-works.md) - [IPFS primer](https://dweb-primer.ipfs.io/) -- [Glossary](/concepts/glossary/) -- [FAQ](/concepts/faq/) +- [Glossary](glossary.md) +- [FAQ](faq.md) ## Examples and case studies Get inspired by usage ideas, explore examples of IPFS implemented in the wild, and dig deeper with case studies on applications and projects in which IPFS plays a crucial role. -- [Usage ideas & examples](/concepts/usage-ideas-examples/) -- [Case study: Arbol](/concepts/case-study-arbol/) -- [Case study: Audius](/concepts/case-study-audius/) -- [Case study: Fleek](/concepts/case-study-fleek/) -- [Case study: LikeCoin](/concepts/case-study-likecoin/) -- [Case study: Morpheus.Network](/concepts/case-study-morpheus/) -- [Case study: OpenBazaar](/concepts/case-study-openbazaar/) +- [Usage ideas & examples](usage-ideas-examples.md) +- [Case study: Arbol](case-study-arbol.md) +- [Case study: Audius](case-study-audius.md) +- [Case study: Fleek](case-study-fleek.md) +- [Case study: LikeCoin](case-study-likecoin.md) +- [Case study: Morpheus.Network](case-study-morpheus.md) +- [Case study: OpenBazaar](case-study-openbazaar.md) ## Content-addressed storage Referring to files by their content, not their location, is one of the most powerful concepts within IPFS. Learn why with explainers on: -- [Content addressing](/concepts/content-addressing/) -- [Cryptographic hashing](/concepts/hashing/) -- [Immutability](/concepts/immutability/) -- [Persistence, permanence and pinning](/concepts/persistence/) +- [Content addressing](content-addressing.md) +- [Cryptographic hashing](hashing.md) +- [Immutability](immutability.md) +- [Persistence, permanence and pinning](persistence.md) ## Peer-to-peer file sharing Sharing files between peers is incredibly powerful — and has many nuances! Learn about file-sharing paradigms and tools: -- [Distributed Hash Tables (DHTs)](/concepts/dht/) -- [Merkle DAGs](/concepts/merkle-dag/) -- [Bitswap](/concepts/bitswap/) -- [IPLD](/concepts/ipld/) -- [IPNS](/concepts/ipns/) -- [libp2p](/concepts/libp2p/) -- [File systems](/concepts/file-systems/) +- [Distributed Hash Tables (DHTs)](dht.md) +- [Merkle DAGs](merkle-dag.md) +- [Bitswap](bitswap.md) +- [IPLD](ipld.md) +- [IPNS](ipns.md) +- [libp2p](libp2p.md) +- [File systems](file-systems.md) ## Integrating IPFS and the existing Web IPFS aims to be the future of the internet, but it still needs to play well with today's Web. Here are some ways to do just that: -- [IPFS Gateway](/concepts/ipfs-gateway/) -- [DNSLink](/concepts/dnslink/) +- [IPFS Gateway](ipfs-gateway.md) +- [DNSLink](dnslink.md) ## Further reading -Want a more in-depth look into the decentralized web? Here are a few papers that are useful for understanding IPFS, whether it be understanding the IPFS spec itself or the background for the web, protocols, hashing, and so on. [Read the papers →](/concepts/further-reading/academic-papers) +Want a more in-depth look into the decentralized web? Here are a few papers that are useful for understanding IPFS, whether it be understanding the IPFS spec itself or the background for the web, protocols, hashing, and so on. [Read the papers →](further-reading/academic-papers.md) -You may also be interested in the community made [IPFS Primer →](https://dweb-primer.ipfs.io/) +You may also be interested in the community-made [IPFS Primer →](https://dweb-primer.ipfs.io/) ## Don't see what you're looking for? diff --git a/docs/concepts/case-study-arbol.md b/docs/concepts/case-study-arbol.md index b1038ad1b..314de5092 100644 --- a/docs/concepts/case-study-arbol.md +++ b/docs/concepts/case-study-arbol.md @@ -19,7 +19,7 @@ _— Ben Andre, CTO, Arbol_ [Arbol](https://www.arbolmarket.com/) is a software platform that connects agricultural entities like farmers and other weather-dependent parties with investors and other capital providers to insure and protect against weather-related risks. Arbol's platform sells contracts for parametric weather protection agreements in a marketplace that's an innovative, data-driven approach to risk management, cutting out the usual legacy insurance claims process of making loss assessments on the ground. Instead, Arbol relies on tamper-proof data indexes to determine payouts, and doesn't require a defined loss to be indemnified. Arbol's platform combines parametric weather protection with blockchain-based smart contracts to provide cost-efficient, automated, and user-defined weather-related risk hedging. As with traditional crop insurance and similar legacy products, end users purchase assurance that they'll be financially protected in the case of adverse weather — but with Arbol, these end users are paid automatically if adverse conditions occur, as defined by the contract and measured by local meteorological observations tracked by Arbol's data sources. -To build the data indexes that Arbol uses to handle its contracts, the team aggregates and standardizes billions of data files comprising decades of weather information from a wide range of reputable sources — all of which is stored on IPFS. IPFS is critical to Arbol's service model due to the inherent verifiability provided by its [content-addressed architecture](/concepts/content-addressing), as well as a decentralized data delivery model that facilitates Arbol's day-to-day aggregation, synchronization, and distribution of massive amounts of data. +To build the data indexes that Arbol uses to handle its contracts, the team aggregates and standardizes billions of data files comprising decades of weather information from a wide range of reputable sources — all of which is stored on IPFS. IPFS is critical to Arbol's service model due to the inherent verifiability provided by its [content-addressed architecture](content-addressing.md), as well as a decentralized data delivery model that facilitates Arbol's day-to-day aggregation, synchronization, and distribution of massive amounts of data. While United States agribusiness has been Arbol's initial area of focus, the team has built a globally capable platform, with expansion underway to new regions and industries around the world. Arbol currently provides contracts for managing the risks of weather exposure in the energy and agriculture sectors, and features both custom and pre-designed protection agreements for clients across industries and scale. Their current end-user base ranges from small coffee farms to major agribusinesses and power producers. @@ -62,7 +62,7 @@ Arbol builds its data indexes by drawing on large weather-related datasets from Arbol's business model hinges upon the benefits afforded by IPFS — without its immutable content addressing and inherent data verifiability, the benefits Arbol provides would be impossible to achieve in a cost-effective and efficient way. As a whole, IPFS is critical to Arbol's service model by providing the following: -- **Immutable addressing:** Because all data stored using IPFS is referenced and accessed via unique [content identifiers (CIDs)](/concepts/content-addressing), any change to a data item means it receives a new CID exclusive to that revision. It's impossible to change data without changing its CID. +- **Immutable addressing:** Because all data stored using IPFS is referenced and accessed via unique [content identifiers (CIDs)](content-addressing.md), any change to a data item means it receives a new CID exclusive to that revision. It's impossible to change data without changing its CID. - **Data verifiability:** Contracts on Arbol's platform are linked to specific, verifiably unchanged, content-addressed data. Because parametric weather risk management absolutely relies on user agreement about and trust in source data, Arbol's approach offers reassurance unavailable with other offerings in the market. @@ -80,15 +80,15 @@ Arbol's end users enjoy the "it just works" benefits of parametric protection, b 4. **Compression:** This step is the final one before data is imported to IPFS. Arbol compresses each file to save on disk space and reduce sync time. -5. **Hashing:** Arbol uses the stock IPFS recursive add operation ([`ipfs add -r`](/reference/cli/#ipfs-add)) for hashing, as well as the experimental `no-copy` feature. This feature cuts down on disk space used by the hashing node, especially on the initial build of the dataset. Without it, an entire dataset would be copied into the local IPFS datastore directory. This can create problems, since the default flat file system datastore (`flatfs`) can start to run out of index nodes (the software representation of disk locations) after a few million files, leading to hashing failure. Arbol is also experimenting with [Badger](/recent-releases/go-ipfs-0-5/features/#badger-integration), an alternative to flat file storage, in collaboration with the IPFS core team as the core team considers incorporating this change into IPFS itself. +5. **Hashing:** Arbol uses the stock IPFS recursive add operation ([`ipfs add -r`](./reference/cli/#ipfs-add)) for hashing, as well as the experimental `no-copy` feature. This feature cuts down on disk space used by the hashing node, especially on the initial build of the dataset. Without it, an entire dataset would be copied into the local IPFS datastore directory. This can create problems, since the default flat file system datastore (`flatfs`) can start to run out of index nodes (the software representation of disk locations) after a few million files, leading to hashing failure. Arbol is also experimenting with [Badger](https://github.com/ipfs/go-ipfs/releases/tag/v0.5.0), an alternative to flat file storage, in collaboration with the IPFS core team as the core team considers incorporating this change into IPFS itself. 6. **Verification:** To ensure no errors were introduced to files during the parsing stage, queries are made to the source data files and compared against the results of an identical query made to the parsed, hashed data. 7. **Publishing:** Once a hash has been verified, it is posted to Arbol's master heads reference file, and is at this point accessible via Arbol's gateway and available for use in contracts. -8. **Pinning and syncing:** When storage nodes in the Arbol network detect that a new hash has been added to the heads file, they run the standard, recursive [`ipfs pin -r`](/reference/cli/#ipfs-pin) command on it. Arbol's primary active nodes don't need to be large in number: The network includes a single [gateway node](/concepts/ipfs-gateway/) that bootstraps with all the parsing/hashing nodes, and a few large storage nodes that serve as the primary data storage backup. However, data is also regularly synced with "cold nodes" — archival storage nodes that are mostly kept offline — as well as on individual IPFS nodes on Arbol's developers' and agronomists' personal computers. +8. **Pinning and syncing:** When storage nodes in the Arbol network detect that a new hash has been added to the heads file, they run the standard, recursive [`ipfs pin -r`](./reference/cli.md#ipfs-pin) command on it. Arbol's primary active nodes don't need to be large in number: The network includes a single [gateway node](ipfs-gateway.md) that bootstraps with all the parsing/hashing nodes, and a few large storage nodes that serve as the primary data storage backup. However, data is also regularly synced with "cold nodes" — archival storage nodes that are mostly kept offline — as well as on individual IPFS nodes on Arbol's developers' and agronomists' personal computers. -9. **Garbage collection:** Some older Arbol datasets require [garbage collection](/concepts/glossary/#garbage-collection) whenever new data is added, due to a legacy method of overwriting old hashes with new hashes. However, all of Arbol's newer datasets use an architecture where old hashes are preserved and new posts reference the previous post. This methodology creates a linked list of hashes, with each hash containing a reference to the previous hash. As the length of the list becomes computationally burdensome, the system consolidates intermediate nodes and adds a new route to the head, creating a [DAG (directed acyclic graph)](/concepts/merkle-dag/) structure. Heads are always stored in a master [heads.json reference file](https://gateway.arbolmarket.com/climate/hashes/heads.json) located on Arbol's command server. +9. **Garbage collection:** Some older Arbol datasets require [garbage collection](glossary.md#garbage-collection) whenever new data is added, due to a legacy method of overwriting old hashes with new hashes. However, all of Arbol's newer datasets use an architecture where old hashes are preserved and new posts reference the previous post. This methodology creates a linked list of hashes, with each hash containing a reference to the previous hash. As the length of the list becomes computationally burdensome, the system consolidates intermediate nodes and adds a new route to the head, creating a [DAG (directed acyclic graph)](merkle-dag.md) structure. Heads are always stored in a master [heads.json reference file](https://gateway.arbolmarket.com/climate/hashes/heads.json) located on Arbol's command server. ### The tooling diff --git a/docs/concepts/case-study-fleek.md b/docs/concepts/case-study-fleek.md index 77f72689a..8852f9124 100644 --- a/docs/concepts/case-study-fleek.md +++ b/docs/concepts/case-study-fleek.md @@ -62,7 +62,7 @@ In short, Fleek's portfolio offers wide-ranging functionality and a bridge betwe Fleek chose IPFS because it decentralizes two of the core aspects of the internet: file storage and data transfer. Combined with the inherent advantages of IPFS content addressing and IPFS's position as a fundamental technology in Filecoin, this opens up a host of benefits not available elsewhere: -- **Data integrity in a peer-to-peer world:** Fleek uses IPFS in combination with encryption tools like Textile's, enabling them to offer a best-of-both-worlds paradigm where users get the benefits of client-side encryption (through user-owned keys) as well as the ability to share data directly without touching any third-party servers. Because the transport is encrypted by default, external watchers can't view it in transit, and IPFS's [content addressing](/concepts/content-addressing/) also ensures that the data a user receives when they make a request is cryptographically verified as the data they asked for. +- **Data integrity in a peer-to-peer world:** Fleek uses IPFS in combination with encryption tools like Textile's, enabling them to offer a best-of-both-worlds paradigm where users get the benefits of client-side encryption (through user-owned keys) as well as the ability to share data directly without touching any third-party servers. Because the transport is encrypted by default, external watchers can't view it in transit, and IPFS's [content addressing](content-addressing.md) also ensures that the data a user receives when they make a request is cryptographically verified as the data they asked for. - **Censorship and disaster resilience:** IPFS content addressing allows for multiple copies of the same content-addressed resource to exist as equivalent items in multiple locations worldwide. This can offer the potential for a degree of resilience against physical disaster or censorship unavailable on the legacy web. - **Integrated access to future storage and retrieval markets:** Because IPFS and Filecoin are so tightly integrated, building on IPFS will facilitate the ability to offer Fleek users a seamless way to access the Filecoin marketplace for their storage needs. diff --git a/docs/concepts/case-study-likecoin.md b/docs/concepts/case-study-likecoin.md index 27327ce78..81e2fadc1 100644 --- a/docs/concepts/case-study-likecoin.md +++ b/docs/concepts/case-study-likecoin.md @@ -65,8 +65,8 @@ As a "free republic" of content creators, curators and publishers, and consumers The LikeCoin team's core goals of providing a quantifiably rewardable space for creators and curators to share content without fear of corporate or governmental control are directly enabled by IPFS, specifically through these core benefits: -- **Performant distributed storage:** IPFS provides a reliable, proven solution for distributed storage out of the box, backed by active core development and an engaged international [user and developer community](/community/). -- **Data integrity:** Thanks to its inherent use of [content addressing](https://docs.ipfs.io/concepts/content-addressing/), IPFS generates a unique content identifier (CID) for every artifact stored on IPFS — meaning that if an item is modified, its CID changes, too. Creators, curators, and users can share and view content in Liker Land with assurance that items haven't been modified by third parties. +- **Performant distributed storage:** IPFS provides a reliable, proven solution for distributed storage out of the box, backed by active core development and an engaged international [user and developer community](../community/README.md). +- **Data integrity:** Thanks to its inherent use of [content addressing](content-addressing.md), IPFS generates a unique content identifier (CID) for every artifact stored on IPFS — meaning that if an item is modified, its CID changes, too. Creators, curators, and users can share and view content in Liker Land with assurance that items haven't been modified by third parties. - **Censorship resistance:** API gateways to the LikeCoin blockchain itself can potentially be blocked by governments or other infrastructure players. By contrast, content stored and provided using IPFS can be accessed as long as a copy exists on an IPFS node somewhere on the network. - **IPLD as a blockchain intermediary:** Using the [IPLD plugin](https://github.com/ipfs/go-ipfs/tree/master/plugin) included in `go-ipfs`, any IPFS node can be used to access data stored on the LikeCoin blockchain. This makes it much harder for anyone to block access to LikeCoin-affiliated content. And because the plugin enables users to retrieve ISCN metadata through a CID — just like with any other piece of content on IPFS — the user experience of interacting with the LikeCoin blockchain is simplified even further. @@ -94,7 +94,7 @@ Because the LikeCoin blockchain itself is built in Go, the team was able to easi ## LikeCoin + IPFS: the future -As the LikeCoin ecosystem continues to evolve, the team looks forward to incorporating current and future IPFS features, too. One particular future goal is to integrate [IPNS](https://docs.ipfs.io/concepts/ipns/), the InterPlanetary Name System, into LikeCoin's architecture. At present, in order to retrieve both a content item and all its associated ISCN metadata, LikeCoin code requires both an IPFS CID and the ISCN identifier itself. The team plans to use IPNS to link an ISCN with all corresponding IPFS CIDs in a single, updatable reference — something that would greatly streamline and simplify LikeCoin's data query and retrieval process. +As the LikeCoin ecosystem continues to evolve, the team looks forward to incorporating current and future IPFS features, too. One particular future goal is to integrate [IPNS](ipns.md), the InterPlanetary Name System, into LikeCoin's architecture. At present, in order to retrieve both a content item and all its associated ISCN metadata, LikeCoin code requires both an IPFS CID and the ISCN identifier itself. The team plans to use IPNS to link an ISCN with all corresponding IPFS CIDs in a single, updatable reference — something that would greatly streamline and simplify LikeCoin's data query and retrieval process. ::: callout **"The future of LikeCoin is inextricably linked with the future of IPFS. We are actively experimenting with some of the most cutting-edge features of IPFS. Integrating these features into the LikeCoin ecosystem is crucial to our mission."** diff --git a/docs/concepts/case-study-morpheus.md b/docs/concepts/case-study-morpheus.md index 630dc8ca9..7b934e250 100644 --- a/docs/concepts/case-study-morpheus.md +++ b/docs/concepts/case-study-morpheus.md @@ -73,7 +73,7 @@ _— Noam Eppel, COO and co-founder, Morpheus.Network_ ## How Morpheus.Network uses IPFS -As noted above, Morpheus.Network's integration of IPFS was extremely straightforward. With the help of IPFS [documentation](https://docs.ipfs.io/) and an extensive [developer community](https://docs.ipfs.io/community/), the team was able to use standard IPFS tooling without any need for additional customization. +As noted above, Morpheus.Network's integration of IPFS was extremely straightforward. With the help of IPFS [documentation](../README.md) and an extensive [developer community](../community/README.md), the team was able to use standard IPFS tooling without any need for additional customization. The Morpheus.Network team chose to run their own private IPFS nodes for two primary reasons: diff --git a/docs/concepts/content-addressing.md b/docs/concepts/content-addressing.md index 9b367bf18..957c87a69 100644 --- a/docs/concepts/content-addressing.md +++ b/docs/concepts/content-addressing.md @@ -14,7 +14,7 @@ For a deep dive into how Content Identifiers (CIDs) are constructed, take a look A _content identifier_, or CID, is a label used to point to material in IPFS. It doesn't indicate _where_ the content is stored, but it forms a kind of address based on the content itself. CIDs are short, regardless of the size of their underlying content. -CIDs are based on the content’s [cryptographic hash](/concepts/hashing/). That means: +CIDs are based on the content’s [cryptographic hash](hashing.md). That means: - Any difference in the content will produce a different CID and - The same content added to two different IPFS nodes using the same settings will produce _the same CID_. @@ -23,7 +23,7 @@ IPFS uses the `sha-256` hashing algorithm by default, but there is support for m ## Identifier formats -CIDs can take a few different forms with different encoding bases or CID versions. Many of the existing IPFS tools still generate v0 CIDs, although the `files` ([Mutable File System](/concepts/file-systems/#mutable-file-system-mfs)) and `object` operations now use CIDv1 by default. +CIDs can take a few different forms with different encoding bases or CID versions. Many of the existing IPFS tools still generate v0 CIDs, although the `files` ([Mutable File System](file-systems.md#mutable-file-system-mfs)) and `object` operations now use CIDv1 by default. ### Version 0 (v0) @@ -43,7 +43,7 @@ These leading identifiers also provide forward-compatibility, supporting differe You can use the first few bytes of the CID to interpret the remainder of the content address and know how to decode the content after being fetched from IPFS. For more details, check out the [CID specification](https://github.com/ipld/cid). It includes a [decoding algorithm](https://github.com/ipld/cid/blob/ef1b2002394b15b1e6c26c30545fd485f2c4c138/README.md#decoding-algorithm) and links to existing software implementations for decoding CIDs. -If you can't decide between CIDv0 and CIDv1, consider choosing CIDv1 for your new project and opt in by passing a version flag (`ipfs add --cid-version 1`). This is more future-proof and [safe for use in browser contexts](/how-to/address-ipfs-on-web/#subdomain-gateway). +If you can't decide between CIDv0 and CIDv1, consider choosing CIDv1 for your new project and opt in by passing a version flag (`ipfs add --cid-version 1`). This is more future-proof and [safe for use in browser contexts](../how-to/address-ipfs-on-web.md#subdomain-gateway). The IPFS project will switch to CIDv1 as the new default in the near future. @@ -57,7 +57,7 @@ Check out ProtoSchool's [Anatomy of a CID](https://proto.school/anatomy-of-a-cid ## CID conversion Converting a CID from v0 to v1 enables it to be represented in multibase encodings. -The default for CIDv1 is the case-insensitive `base32`, but use of the shorter `base36` is encouraged for IPNS names to ensure same text representation on [subdomains](/how-to/address-ipfs-on-web/#subdomain-gateway). +The default for CIDv1 is the case-insensitive `base32`, but use of the shorter `base36` is encouraged for IPNS names to ensure same text representation on [subdomains](../how-to/address-ipfs-on-web.md#subdomain-gateway). ### v0 to v1 @@ -130,7 +130,7 @@ Use it as-is (it is a [valid CID](https://ipfs.io/ipfs/f01701220c3c4733ec8affd06 ``` ::: tip -[Subdomain gateways](/how-to/address-ipfs-on-web/#subdomain-gateway) convert paths with custom bases like base16 to base32 or base36, in an effort to fit a CID in a DNS label: +[Subdomain gateways](../how-to/address-ipfs-on-web.md#subdomain-gateway) convert paths with custom bases like base16 to base32 or base36, in an effort to fit a CID in a DNS label: - [dweb.link/ipfs/f01701220c3c4733ec8affd06cf9e9ff50ffc6bcd2ec85a6170004bb709669c31de94391a](https://dweb.link/ipfs/f01701220c3c4733ec8affd06cf9e9ff50ffc6bcd2ec85a6170004bb709669c31de94391a) returns a HTTP 301 redirect: → [bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi.ipfs.dweb.link](https://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi.ipfs.dweb.link/) diff --git a/docs/concepts/dnslink.md b/docs/concepts/dnslink.md index f56b414f6..196692875 100644 --- a/docs/concepts/dnslink.md +++ b/docs/concepts/dnslink.md @@ -8,7 +8,7 @@ description: Learn how to map IPFS content to DNS names using DNSLink. DNSLink uses [DNS `TXT` records](https://en.wikipedia.org/wiki/TXT_record) to map a DNS name, like ipfs.io`, to an IPFS address. Because you can edit your DNS records, you can use them to always point to the latest version of an object in IPFS. Since DNSLink uses DNS records, you can assign names, paths, and sub-domains that are easy to type, read, and remember. -A DNSLink address looks like an [IPNS](/guides/concepts/ipns) address, but it uses a DNS name in place of a hashed public key: +A DNSLink address looks like an [IPNS](ipns.md) address, but it uses a DNS name in place of a hashed public key: ``` /ipns/example.org diff --git a/docs/concepts/faq.md b/docs/concepts/faq.md index 3d94b7c86..84823f6aa 100644 --- a/docs/concepts/faq.md +++ b/docs/concepts/faq.md @@ -10,7 +10,7 @@ description: Explore frequently asked questions about IPFS, the InterPlanetary F IPFS stands for the InterPlanetary File System — a peer-to-peer network for storing and accessing files, websites, applications, and data in a distributed file system. -To learn more, see the ["what is IPFS?"](/concepts/what-is-ipfs) guide. +To learn more, see the ["what is IPFS?"](what-is-ipfs.md) guide. ## IPFS in action @@ -24,13 +24,13 @@ To learn more, see the ["what is IPFS?"](/concepts/what-is-ipfs) guide. The quickest way to get IPFS up and running on your machine is by installing [IPFS Desktop](https://github.com/ipfs-shipyard/ipfs-desktop), the easy-to-use app that enables you to run an IPFS node on your computer without having to bother with terminal commands. -For installing and initializing IPFS from the command line, check out the [command-line quick start](/how-to/command-line-quick-start/) guide. +For installing and initializing IPFS from the command line, check out the [command-line quick start](../how-to/command-line-quick-start.md) guide. ## Contributing to IPFS ### How do I start contributing to IPFS? -There are a lot of ways you can contribute to IPFS, whether you're interested in helping with either of the core implementations, applications like IPFS Desktop, writing or editing documentation, doing UX, or whatever you enjoy working on. [Get all the details on where to get started here.](/project/contribute/) +There are a lot of ways you can contribute to IPFS, whether you're interested in helping with either of the core implementations, applications like IPFS Desktop, writing or editing documentation, doing UX, or whatever you enjoy working on. [Get all the details on where to get started here.](../project/contribute.md) ## IPFS and Filecoin diff --git a/docs/concepts/glossary.md b/docs/concepts/glossary.md index bd0ceab5a..973d919db 100644 --- a/docs/concepts/glossary.md +++ b/docs/concepts/glossary.md @@ -38,7 +38,7 @@ A Block is a binary blob of data, identified by a [CID](#cid). ### Bootstrap Node -A Bootstrap Node is a trusted peer on the IPFS network through which an IPFS node learns about other peers on the network. [More about Bootstrapping](https://docs.ipfs.io/how-to/modify-bootstrap-list/) +A Bootstrap Node is a trusted peer on the IPFS network through which an IPFS node learns about other peers on the network. [More about Bootstrapping](../how-to/modify-bootstrap-list.md) ## C @@ -48,15 +48,15 @@ The Concise Binary Object Representation (CBOR) is a data format based on [JSON] ### CID -A Content Identifier (CID) is a self-describing content-addressed label used to point to the data stored in IPFS. It is the core identifier used for IPFS and [IPLD](#ipld). [More about CID](https://docs.ipfs.io/concepts/content-addressing/) +A Content Identifier (CID) is a self-describing content-addressed label used to point to the data stored in IPFS. It is the core identifier used for IPFS and [IPLD](#ipld). [More about CID](../concepts/content-addressing.md) ### CID v0 -Version 0 (v0) of the IPFS content identifier. This CID is 46 characters in length, starting with "Qm". Uses a base 58-encoded multihash, very simple but much less flexible than newer CIDs. [More about CID v0](https://docs.ipfs.io/concepts/content-addressing/#version-0-v0) +Version 0 (v0) of the IPFS content identifier. This CID is 46 characters in length, starting with "Qm". Uses a base 58-encoded multihash, very simple but much less flexible than newer CIDs. [More about CID v0](../concepts/content-addressing.md#version-0-v0) ### CID v1 -Version 1 (v1) of the IPFS content identifier. This CID version contains some leading identifiers which provide for forward-compatibility. Able to support different formats for future versions of CID. [More about CID v1](https://docs.ipfs.io/concepts/content-addressing/#version-1-v1) +Version 1 (v1) of the IPFS content identifier. This CID version contains some leading identifiers which provide for forward-compatibility. Able to support different formats for future versions of CID. [More about CID v1](../concepts/content-addressing.md#version-1-v1) ### CRDT @@ -66,7 +66,7 @@ A Conflict-Free Replicated Data Type (CRDT) is a type of specially-designed data ### Daemon -A Daemon is a computer program that typically runs in the background. The IPFS daemon is how you take your node online to the IPFS network. [More about IPFS Daemon](https://docs.ipfs.io/how-to/command-line-quick-start/#take-your-node-online) +A Daemon is a computer program that typically runs in the background. The IPFS daemon is how you take your node online to the IPFS network. [More about IPFS Daemon](../how-to/command-line-quick-start.md#take-your-node-online) ### DAG @@ -78,11 +78,11 @@ The Datastore is the on-disk storage system used by an IPFS node. Configuration ### DHT -A Distributed Hash Table (DHT) is a distributed key-value store where keys are cryptographic hashes. In IPFS, each peer is responsible for a subset of the IPFS DHT. [More about DHT](https://docs.ipfs.io/concepts/dht/) +A Distributed Hash Table (DHT) is a distributed key-value store where keys are cryptographic hashes. In IPFS, each peer is responsible for a subset of the IPFS DHT. [More about DHT](dht.md) ### Dialing -Dialing is a function of the IPFS networking layer in [libp2p](#libp2p), wherein a connection is opened to another peer. Together, an implementation of dialing and [listening](#listening) forms a [transport](#transport"). +Dialing is a function of the IPFS networking layer in [libp2p](#libp2p), wherein a connection is opened to another peer. Together, an implementation of dialing and [listening](#listening) forms a [transport](#transport). ### DNSLink @@ -122,7 +122,7 @@ Graphsync is an alternative content replication protocol under discussion, simil ### Hash -A Cryptographic Hash is a function that takes some arbitrary input (content) and returns a fixed-length value. The exact same input data will always generate the same hash as output. There are numerous hash algorithms. [More about Hash](https://docs.ipfs.io/concepts/hashing/) +A Cryptographic Hash is a function that takes some arbitrary input (content) and returns a fixed-length value. The exact same input data will always generate the same hash as output. There are numerous hash algorithms. [More about Hash](hashing.md) ## I @@ -136,7 +136,7 @@ The InterPlanetary Linked Data (IPLD) model is a set of specifications in suppor ### IPNS -The InterPlanetary Name System (IPNS) is a system for creating and updating mutable links to IPFS content. IPNS allows for publishing the latest version of any IPFS content, even though the underlying IPFS hash has changed. [More about IPNS](https://docs.ipfs.io/concepts/ipns/) +The InterPlanetary Name System (IPNS) is a system for creating and updating mutable links to IPFS content. IPNS allows for publishing the latest version of any IPFS content, even though the underlying IPFS hash has changed. [More about IPNS](ipns.md) ## J @@ -160,7 +160,7 @@ Listening is a function of the IPFS networking layer in libp2p, wherein an incom ### Merkle-DAG -The Merkle-DAG is a computer science data structure used at the core of IPFS files/block storage. Merkle-DAGs create a hash to their content, known as a [Content Identifier](#cid). [More about Merkle-DAG](https://docs.ipfs.io/concepts/merkle-dag/) +The Merkle-DAG is a computer science data structure used at the core of IPFS files/block storage. Merkle-DAGs create a hash to their content, known as a [Content Identifier](#cid). [More about Merkle-DAG](merkle-dag.md) ### Merkle Forest @@ -172,7 +172,7 @@ A Merkle Tree is a specific type of hash tree used in cryptography and computer ### MFS -The Mutable File System (MFS) is a tool built into IPFS that lets you treat files like a normal name-based filesystem. You may add, edit, and remove MFS files while all link updates and hashes are taken care of for you. [More about MFS](https://docs.ipfs.io/concepts/file-systems/#mutable-file-system-mfs) +The Mutable File System (MFS) is a tool built into IPFS that lets you treat files like a normal name-based filesystem. You may add, edit, and remove MFS files while all link updates and hashes are taken care of for you. [More about MFS](file-systems.md#mutable-file-system-mfs) ### Multibase @@ -194,7 +194,7 @@ The Multiformats project is a collection of protocols that aim to future-proof s ### Node -A Node or [peer](#peer) is the IPFS program that you run on your local computer to store/cache files and then connect to the IPFS network (by running the [daemon](#daemon)). [More about Node](https://docs.ipfs.io/how-to/command-line-quick-start/#take-your-node-online) +A Node or [peer](#peer) is the IPFS program that you run on your local computer to store/cache files and then connect to the IPFS network (by running the [daemon](#daemon)). [More about Node](../how-to/command-line-quick-start.md#take-your-node-online) ## O @@ -202,7 +202,7 @@ A Node or [peer](#peer) is the IPFS program that you run on your local computer ### Path/Address -A Path/Address is the method within IPFS of referencing content on the web. Addresses for content are path-like; they are components separated by slashes. [More about Path/Address](https://docs.ipfs.io/how-to/address-ipfs-on-web/) +A Path/Address is the method within IPFS of referencing content on the web. Addresses for content are path-like; they are components separated by slashes. [More about Path/Address](../how-to/address-ipfs-on-web.md) ### Peer @@ -210,11 +210,11 @@ In system architecture, a Peer is an equal player in the peer-to-peer model of d ### Peer ID -A Peer ID is how each unique IPFS node is identified on the network. The Peer ID is created when the IPFS node is initialized and is essentially a cryptographic hash of the node's public key. [More about Peer ID](https://docs.ipfs.io/concepts/dht/#peer-ids) +A Peer ID is how each unique IPFS node is identified on the network. The Peer ID is created when the IPFS node is initialized and is essentially a cryptographic hash of the node's public key. [More about Peer ID](dht.md#peer-ids) ### Pinning -Pinning is the method of telling an IPFS node that particular data is important and so it will never be removed from that node's cache. To learn more, start by understanding [persistence, permanence, and pinning](/concepts/persistence/); then, see how to [add local pin](/how-to/pin-files/) and read [what remote pins are](#remote-pinning). +Pinning is the method of telling an IPFS node that particular data is important and so it will never be removed from that node's cache. To learn more, start by understanding [persistence, permanence, and pinning](persistence.md); then, see how to [add local pin](../how-to/pin-files.md) and read [what remote pins are](#remote-pinning). ### Pinning Service API @@ -230,7 +230,7 @@ Publish-subscribe (Pubsub) is an experimental feature in IPFS. Publishers send m ### Remote Pinning -A variant of [pinning](#pinning) that uses a third-party service to ensure that data persists on IPFS, even when your local node goes offline or your local copy of data is deleted during garbage collection. [More about working with remote pinning services](/how-to/work-with-pinning-services/). +A variant of [pinning](#pinning) that uses a third-party service to ensure that data persists on IPFS, even when your local node goes offline or your local copy of data is deleted during garbage collection. [More about working with remote pinning services](../how-to/work-with-pinning-services.md). ### Relay @@ -238,7 +238,7 @@ The Relay is a means to establish connectivity between libp2p nodes (e.g., IPFS ### Repo -The Repository (Repo) is a directory where IPFS stores all its settings and internal data. It is created with the `ipfs init` command. [More about Repo](https://docs.ipfs.io/how-to/command-line-quick-start/#install-ipfs) +The Repository (Repo) is a directory where IPFS stores all its settings and internal data. It is created with the `ipfs init` command. [More about Repo](../how-to/command-line-quick-start.md#install-ipfs) ## S @@ -252,7 +252,7 @@ The signing of data cryptographically allows for trusting of data from untrusted ### Swarm -The Swarm is a term for the network of IPFS peers with which your local node has connections. Swarm addresses are addresses that your local node will listen on for connections from other IPFS peers. [More about Swarm addresses](https://docs.ipfs.io/how-to/configure-node/#addresses) +The Swarm is a term for the network of IPFS peers with which your local node has connections. Swarm addresses are addresses that your local node will listen on for connections from other IPFS peers. [More about Swarm addresses](../how-to/configure-node.md#addresses) ## T @@ -264,7 +264,7 @@ In [libp2p](#libp2p), transport refers to the technology that lets us move data ### UnixFS -The Unix File System (UnixFS) is the data format used to represent files and all their links and metadata in IPFS. It is loosely based on how files work in Unix. Adding a file to IPFS creates a block, or a _tree_ of blocks, in the UnixFS format and protects it from being garbage-collected. [More about UnixFS](https://docs.ipfs.io/concepts/file-systems/#unix-file-system-unixfs) +The Unix File System (UnixFS) is the data format used to represent files and all their links and metadata in IPFS. It is loosely based on how files work in Unix. Adding a file to IPFS creates a block, or a _tree_ of blocks, in the UnixFS format and protects it from being garbage-collected. [More about UnixFS](file-systems.md#unix-file-system-unixfs) ## V diff --git a/docs/concepts/hashing.md b/docs/concepts/hashing.md index fd0c2f499..9c53038b6 100644 --- a/docs/concepts/hashing.md +++ b/docs/concepts/hashing.md @@ -32,7 +32,7 @@ However, the exact same input generates the following output using **SHA-256**: Notice that the second hash is longer than the first one. This is because SHA-1 creates a 160-bit hash, while SHA-256 creates a 256-bit hash. The prepended `0x` indicates that the following hash is represented as a hexadecimal number. -Hashes can be represented in different bases (`base2`, `base16`, `base32`, etc.). In fact, IPFS makes use of that as part of its [content identifiers](/concepts/content-addressing/) and supports multiple base representations at the same time, using the [Multibase](https://github.com/multiformats/multibase) protocol. +Hashes can be represented in different bases (`base2`, `base16`, `base32`, etc.). In fact, IPFS makes use of that as part of its [content identifiers](content-addressing.md) and supports multiple base representations at the same time, using the [Multibase](https://github.com/multiformats/multibase) protocol. For example, the SHA-256 hash of "Hello world" from above can be represented as base 32 as: @@ -51,7 +51,7 @@ Cryptographic hashes come with a couple of very important characteristics: These features also mean we can use a cryptographic hash to identify any piece of data: the hash is unique to the data we calculated it from and it's not too long so sending it around the network doesn't take up a lot of resource. A hash is a fixed length, so the SHA-256 hash of a one-gigabyte video file is still only 32 bytes. -That's critical for a distributed system like IPFS, where we want to be able to store and retrieve data from many places. A computer running IPFS can ask all the peers it's connected to whether they have a file with a particular hash and, if one of them does, they send back the whole file. Without a short, unique identifier like a cryptographic hash, that wouldn't be possible. This technique is called [content addressing](/concepts/content-addressing/) — because the content itself is used to form an address, rather than information about the computer and disk location it's stored at. +That's critical for a distributed system like IPFS, where we want to be able to store and retrieve data from many places. A computer running IPFS can ask all the peers it's connected to whether they have a file with a particular hash and, if one of them does, they send back the whole file. Without a short, unique identifier like a cryptographic hash, that wouldn't be possible. This technique is called [content addressing](content-addressing.md) — because the content itself is used to form an address, rather than information about the computer and disk location it's stored at. ## Content identifiers are not file hashes @@ -101,4 +101,4 @@ ubuntu-20.04.1-desktop-amd64.iso: FAILED shasum: WARNING: 1 computed checksum did NOT match ``` -As we can see, the hash included in the CID does NOT match the hash of the input file `ubuntu-20.04.1-desktop-amd64.iso`. To understand what the hash contained in the CID is, we must understand how IPFS stores files. IPFS uses a [directed acyclic graph (DAG)](/concepts/merkle-dag/) to keep track of all the data stored in IPFS. A CID identifies one specific node in this graph. This identifier is the result of hashing the node's contents using a cryptographic hash function like `SHA256`. +As we can see, the hash included in the CID does NOT match the hash of the input file `ubuntu-20.04.1-desktop-amd64.iso`. To understand what the hash contained in the CID is, we must understand how IPFS stores files. IPFS uses a [directed acyclic graph (DAG)](merkle-dag.md) to keep track of all the data stored in IPFS. A CID identifies one specific node in this graph. This identifier is the result of hashing the node's contents using a cryptographic hash function like `SHA256`. diff --git a/docs/concepts/how-ipfs-works.md b/docs/concepts/how-ipfs-works.md index b1528e1a5..02d370cb1 100644 --- a/docs/concepts/how-ipfs-works.md +++ b/docs/concepts/how-ipfs-works.md @@ -30,7 +30,7 @@ That problem exists for the internet and on your computer! Right now, content is - `/Users/Alice/Documents/term_paper.doc` - `C:\Users\Joe\My Documents\project_sprint_presentation.ppt` -By contrast, every piece of content that uses the IPFS protocol has a [_content identifier_](/concepts/content-addressing/), or CID, that is its _hash_. The hash is unique to the content that it came from, even though it may look short compared to the original content. If hashes are new to you, check out our [guide to cryptographic hashing](/concepts/hashing/) for an introduction. +By contrast, every piece of content that uses the IPFS protocol has a [_content identifier_](content-addressing.md), or CID, that is its _hash_. The hash is unique to the content that it came from, even though it may look short compared to the original content. If hashes are new to you, check out our [guide to cryptographic hashing](hashing.md) for an introduction. Many distributed systems make use of content addressing through hashes as a means for not just identifying content but also linking it together — everything from the commits that back your code to the blockchains that run cryptocurrencies leverage this strategy. However, the underlying data structures in these systems are not necessarily interoperable. @@ -40,7 +40,7 @@ IPFS follows particular data-structure preferences and conventions. The IPFS pro ## Directed acyclic graphs (DAGs) -IPFS and many other distributed systems take advantage of a data structure called [directed acyclic graphs](https://en.wikipedia.org/wiki/Directed_acyclic_graph), or DAGs. Specifically, they use _Merkle DAGs_, which are DAGs where each node has a unique identifier that is a hash of the node's contents. Sound familiar? This refers back to the _CID_ concept that we covered in the previous section. Put another way: identifying a data object (like a Merkle DAG node) by the value of its hash _is content addressing_. Check out our [guide to Merkle DAGs](/concepts/merkle-dag/) for a more in-depth treatment of this topic. +IPFS and many other distributed systems take advantage of a data structure called [directed acyclic graphs](https://en.wikipedia.org/wiki/Directed_acyclic_graph), or DAGs. Specifically, they use _Merkle DAGs_, which are DAGs where each node has a unique identifier that is a hash of the node's contents. Sound familiar? This refers back to the _CID_ concept that we covered in the previous section. Put another way: identifying a data object (like a Merkle DAG node) by the value of its hash _is content addressing_. Check out our [guide to Merkle DAGs](merkle-dag.md) for a more in-depth treatment of this topic. IPFS uses a Merkle DAG that is optimized for representing directories and files, but you can structure a Merkle DAG in many different ways. For example, Git uses a Merkle DAG that has many versions of your repo inside of it. @@ -58,7 +58,7 @@ So, to recap, IPFS lets you give CIDs to content and link that content together ## Distributed hash tables (DHTs) -To find which peers are hosting the content you're after (_discovery_), IPFS uses a [distributed hash table](/concepts/dht/), or DHT. A hash table is a database of keys to values. A _distributed_ hash table is one where the table is split across all the peers in a distributed network. To find content, you ask these peers. +To find which peers are hosting the content you're after (_discovery_), IPFS uses a [distributed hash table](dht.md), or DHT. A hash table is a database of keys to values. A _distributed_ hash table is one where the table is split across all the peers in a distributed network. To find content, you ask these peers. The [libp2p project](https://libp2p.io/) is the part of the IPFS ecosystem that provides the DHT and handles peers connecting and talking to each other. (Note that, as with IPLD, libp2p can also be used as a tool for other distributed systems, not just IPFS.) diff --git a/docs/concepts/ipfs-gateway.md b/docs/concepts/ipfs-gateway.md index 27b68c551..c4609d398 100644 --- a/docs/concepts/ipfs-gateway.md +++ b/docs/concepts/ipfs-gateway.md @@ -33,7 +33,7 @@ Tools like [IPFS Companion](https://github.com/ipfs-shipyard/ipfs-companion) res ## Gateway providers -Regardless of who deploys a gateway and where, any IPFS gateway resolves access to any requested IPFS [content identifier](/concepts/content-addressing). Therefore, for best performance, when you need the service of a gateway, you should use the one closest to you. +Regardless of who deploys a gateway and where, any IPFS gateway resolves access to any requested IPFS [content identifier](content-addressing.md). Therefore, for best performance, when you need the service of a gateway, you should use the one closest to you. ### Your local gateway @@ -96,7 +96,7 @@ Subdomain resolution support began with [Go-IPFS](https://github.com/ipfs/go-ipf #### DNSlink -Whenever the content of data within IPFS changes, IPFS creates a new CID based on the content of that data. Many applications require access to the latest version of a file or website but will not know the exact CID for that latest version. The [InterPlanetary Name Service (IPNS)](/concepts/ipns) allows a version-independent IPNS identifier to resolve into the current version's IPFS CID. +Whenever the content of data within IPFS changes, IPFS creates a new CID based on the content of that data. Many applications require access to the latest version of a file or website but will not know the exact CID for that latest version. The [InterPlanetary Name Service (IPNS)](ipns.md) allows a version-independent IPNS identifier to resolve into the current version's IPFS CID. The version-independent IPNS identifier contains a hash. When a gateway processes a request in the form `https://{gatewayURL}/ipns/{IPNS identifier}/{optional path}`, the gateway employs IPNS to resolve the IPNS identifier into the current version's CID and then fetches the corresponding content. diff --git a/docs/concepts/ipns.md b/docs/concepts/ipns.md index 6647aa74f..a567aa02e 100644 --- a/docs/concepts/ipns.md +++ b/docs/concepts/ipns.md @@ -6,11 +6,11 @@ description: Learn about the InterPlanetary Name System (IPNS) and how it can be # InterPlanetary Name System (IPNS) -IPFS uses [content-based addressing](/concepts/content-addressing/); it creates an address of a file based on data contained within the file. If you were to share an IPFS address such as `/ipfs/QmbezGequPwcsWo8UL4wDF6a8hYwM1hmbzYv2mnKkEWaUp` with someone, you would need to give the person a new link every time you update the content. +IPFS uses [content-based addressing](content-addressing.md); it creates an address of a file based on data contained within the file. If you were to share an IPFS address such as `/ipfs/QmbezGequPwcsWo8UL4wDF6a8hYwM1hmbzYv2mnKkEWaUp` with someone, you would need to give the person a new link every time you update the content. The InterPlanetary Name System (IPNS) solves this issue by creating an address that can be updated. -A _name_ in IPNS is the [hash](/concepts/hashing) of a public key. It is associated with a record containing information about the hash it links to that is signed by the corresponding private key. New records can be signed and published at any time. +A _name_ in IPNS is the [hash](hashing.md) of a public key. It is associated with a record containing information about the hash it links to that is signed by the corresponding private key. New records can be signed and published at any time. When looking up an IPNS address, use the `/ipns/` prefix: @@ -113,7 +113,7 @@ ipfs name publish --key=SecondKey /ipfs/QmUVTKsrYJpaxUT7dr9FpKq6AoKHhEM7eG1ZHGL5 ## Example IPNS Setup with JS SDK API -Imagine you want to publish your website under IPFS. You can use the [Files API](/concepts/file-systems/#mutable-file-system-mfs) to publish your static website, and then you'll get a CID you can link to. But when you need to make a change, a problem arises: you get a new CID because you now have different content. And it is not possible for you to be always giving others a new address. +Imagine you want to publish your website under IPFS. You can use the [Files API](file-systems.md#mutable-file-system-mfs) to publish your static website, and then you'll get a CID you can link to. But when you need to make a change, a problem arises: you get a new CID because you now have different content. And it is not possible for you to be always giving others a new address. Here's where the Name API comes in handy. With it, you can create a single, stable IPNS address that points to the CID for the latest version of your website. @@ -133,4 +133,4 @@ In the same way, you can republish a new version of your website under the same ## Alternatives to IPNS -IPNS is not the only way to create mutable addresses on IPFS. You can also use [DNSLink](/concepts/dnslink/), which is currently much faster than IPNS and also uses human-readable names. Other community members are exploring ways to use blockchains to store common name records. +IPNS is not the only way to create mutable addresses on IPFS. You can also use [DNSLink](dnslink.md), which is currently much faster than IPNS and also uses human-readable names. Other community members are exploring ways to use blockchains to store common name records. diff --git a/docs/concepts/merkle-dag.md b/docs/concepts/merkle-dag.md index 8faf72e84..bb07f8731 100644 --- a/docs/concepts/merkle-dag.md +++ b/docs/concepts/merkle-dag.md @@ -18,7 +18,7 @@ A Merkle DAG is a DAG where each node has an identifier, and this is the result Merkle DAGs are similar to Merkle trees, but there are no balance requirements, and every node can carry a payload. In DAGs, several branches can re-converge or, in other words, a node can have several parents. -Identifying a data object (like a Merkle DAG node) by the value of its hash is referred to as _content addressing_. Thus, we name the node identifier as [_Content Identifier_](/concepts/content-addressing/), or CID. +Identifying a data object (like a Merkle DAG node) by the value of its hash is referred to as _content addressing_. Thus, we name the node identifier as [_Content Identifier_](content-addressing.md), or CID. For example, the previous linked list, assuming that the payload of each node is just the CID of its descendant, would be: _A=Hash(B)→B=Hash(C)→C=Hash(∅)_. The properties of the hash function ensure that no cycles can exist when creating Merkle DAGs. (Note: Hash functions are one-way functions. Creating a cycle should then be impossibly difficult unless some weakness is discovered and exploited.) diff --git a/docs/concepts/persistence.md b/docs/concepts/persistence.md index 422eac268..a7e92c6ec 100644 --- a/docs/concepts/persistence.md +++ b/docs/concepts/persistence.md @@ -16,7 +16,7 @@ A 2011 study found that the [average lifespan of a web page is 100 days](https:/ Nodes on the IPFS network can automatically cache resources they download, and keep those resources available for other nodes. This system depends on nodes being willing and able to cache and share resources with the network. Storage is finite, so nodes need to clear out some of their previously cached resources to make room for new resources. This process is called _garbage collection_. -To ensure that data _persists_ on IPFS, and is not deleted during garbage collection, [data can be pinned](/how-to/pin-files/) to one or more IPFS nodes. Pinning gives you control over disk space and data retention. As such, you should use that control to pin any content you wish to keep on IPFS indefinitely. +To ensure that data _persists_ on IPFS, and is not deleted during garbage collection, [data can be pinned](../how-to/pin-files.md) to one or more IPFS nodes. Pinning gives you control over disk space and data retention. As such, you should use that control to pin any content you wish to keep on IPFS indefinitely. ## Garbage Collection @@ -28,7 +28,7 @@ The IPFS garbage collector is configured in the `Datastore`section of [the go-ip - `GCPeriod`: Specify how frequently garbage collection should run. Only used if automatic garbage collection is enabled. The default is 1 hour. -To manually start garbage collection, [run `ipfs repo gc`](https://docs.ipfs.io/reference/cli/#ipfs-repo-gc): +To manually start garbage collection, [run `ipfs repo gc`](../reference/cli.md#ipfs-repo-gc): ```bash ipfs repo gc @@ -56,8 +56,8 @@ If you use IPFS Desktop, you can trigger garbage collection by clicking on the t ## Pinning in context An IPFS node can protect data from garbage collection based on different kinds of user events. -- The universal way is by adding a low-level [local pin](/how-to/pin-files/). This works for all data types and can be done manually, but if you add a file using the CLI command [`ipfs add`](/reference/cli/#ipfs-add), your IPFS node will automatically pin that file for you. -- When working with files and directories, a better way may be to add them to the local [Mutable File System (MFS)](/concepts/glossary/#mfs). This protects the data from garbage collection in the same way as local pinning, but is somewhat easier to manage. +- The universal way is by adding a low-level [local pin](../how-to/pin-files.md). This works for all data types and can be done manually, but if you add a file using the CLI command [`ipfs add`](../reference/cli.md#ipfs-add), your IPFS node will automatically pin that file for you. +- When working with files and directories, a better way may be to add them to the local [Mutable File System (MFS)](glossary.md#mfs). This protects the data from garbage collection in the same way as local pinning, but is somewhat easier to manage. ::: tip @@ -82,4 +82,4 @@ Some available pinning service providers are: - [Temporal](https://temporal.cloud/) - [Crust Network](https://crust.network/) -See how to [work with remote pinning services](/how-to/work-with-pinning-services/). +See how to [work with remote pinning services](../how-to/work-with-pinning-services.md). diff --git a/docs/concepts/privacy.md b/docs/concepts/privacy.md index 0f6bbed75..5de5a3d0f 100644 --- a/docs/concepts/privacy.md +++ b/docs/concepts/privacy.md @@ -8,7 +8,7 @@ related: # IPFS and privacy -As a protocol for peer-to-peer data storage and delivery, IPFS is by design a _public network_: Nodes participating in the network store data affiliated with globally consistent [content addresses](/concepts/content-addressing) (CIDs) and advertise that they have those CIDs available for other nodes to use through publicly viewable [distributed hash tables](/concepts/dht/) (DHTs). This paradigm is one of IPFS's core strengths — at its most basic, it's essentially a globally distributed "server" of the network's total available data, referenceable both by the content itself (those CIDs) and by the participants (the nodes) who have or want the content. +As a protocol for peer-to-peer data storage and delivery, IPFS is by design a _public network_: Nodes participating in the network store data affiliated with globally consistent [content addresses](content-addressing.md) (CIDs) and advertise that they have those CIDs available for other nodes to use through publicly viewable [distributed hash tables](dht.md) (DHTs). This paradigm is one of IPFS's core strengths — at its most basic, it's essentially a globally distributed "server" of the network's total available data, referenceable both by the content itself (those CIDs) and by the participants (the nodes) who have or want the content. What this does mean, however, is that IPFS itself isn't explicitly protecting knowledge _about_ CIDs and the nodes that provide or retrieve them. This isn't something unique to the distributed web; on both the d-web and the legacy web, traffic and other metadata can be monitored in ways that can infer a lot about a network and its users. Some key details on this are outlined below, but in short: While IPFS traffic _between nodes_ is encrypted, the metadata those nodes publish to the DHT is public. Nodes announce a variety of information essential to the DHT's function — including their unique node identifiers (PeerIDs) and the CIDs of data that they're providing — and because of this, information about which nodes are retrieving and/or reproviding which CIDs is publicly available. @@ -26,7 +26,7 @@ All traffic on IPFS is public, including the contents of files themselves (unles ### Content identifiers -Because IPFS uses [content addressing](/concepts/content-addressing/) rather than the legacy web's method of location addressing, each piece of data stored in the IPFS network gets its own unique content identifier (CID). Copies of the data associated with that CID can be stored in any number of locations worldwide on any number of participating IPFS nodes. To make retrieving the data associated with a particular CID efficient and robust, IPFS uses a [distributed hash table](/concepts/dht/) (DHT) to keep track of what's stored where. When you use IPFS to retrieve a particular CID, your node queries the DHT to find the closest nodes to you with that item — and by default also agrees to reprovide that CID to other nodes for a limited time, until periodic "garbage collection" clears your cache of content you haven't used in a while. You can also "pin" CIDs that you want to make sure are never garbage-collected — either explicitly using IPFS's low-level `pin` API, or implicitly using the [Mutable File System](/concepts/file-systems/#mutable-file-system-mfs) (MFS) — which also means you're acting as a permanent reprovider of that data. +Because IPFS uses [content addressing](content-addressing.md) rather than the legacy web's method of location addressing, each piece of data stored in the IPFS network gets its own unique content identifier (CID). Copies of the data associated with that CID can be stored in any number of locations worldwide on any number of participating IPFS nodes. To make retrieving the data associated with a particular CID efficient and robust, IPFS uses a [distributed hash table](dht.md) (DHT) to keep track of what's stored where. When you use IPFS to retrieve a particular CID, your node queries the DHT to find the closest nodes to you with that item — and by default also agrees to reprovide that CID to other nodes for a limited time, until periodic "garbage collection" clears your cache of content you haven't used in a while. You can also "pin" CIDs that you want to make sure are never garbage-collected — either explicitly using IPFS's low-level `pin` API, or implicitly using the [Mutable File System](file-systems.md#mutable-file-system-mfs) (MFS) — which also means you're acting as a permanent reprovider of that data. This is one of the advantages of IPFS over traditional legacy-web hosting. It means retrieving files — especially popular ones that exist on lots of nodes in the network — can be faster and more bandwidth-efficient. However, it's important to note that those DHT queries happen in public. Because of this, it's possible that third parties could be monitoring this traffic to determine what CIDs are being requested, when, and by whom. As IPFS continues to grow in popularity, it's more likely that such monitoring will exist. @@ -34,7 +34,7 @@ This is one of the advantages of IPFS over traditional legacy-web hosting. It me The other half of the equation when considering the prospect of IPFS traffic monitoring is that nodes' unique identifiers are themselves public. Just like with CIDs, every individual IPFS node has its own public identifier (known as a PeerID), such as `QmRGgYP1P5bjgapLaShMVhGMSwGN9SfYG3CM2TfhpJ3igE`. -While a long string of letters and numbers may not be a "Johnny Appleseed" level of human-readable specificity, your PeerID is still a long-lived, unique identifier for your node. Keep in mind that it's possible to do a DHT lookup on your PeerID and, particularly if your node is regularly running from the same location (like your home), find your IP address. (It's possible to [reset your PeerID](https://docs.ipfs.io/reference/cli/#ipfs-key-rotate) if necessary, but similarly to changing your user ID on legacy web apps and services, is likely to involve extra effort.) Additionally, longer-term monitoring of the public IPFS network could yield information about what CIDs your node is requesting and/or reproviding and when. +While a long string of letters and numbers may not be a "Johnny Appleseed" level of human-readable specificity, your PeerID is still a long-lived, unique identifier for your node. Keep in mind that it's possible to do a DHT lookup on your PeerID and, particularly if your node is regularly running from the same location (like your home), find your IP address. (It's possible to [reset your PeerID](../reference/cli.md#ipfs-key-rotate) if necessary, but similarly to changing your user ID on legacy web apps and services, is likely to involve extra effort.) Additionally, longer-term monitoring of the public IPFS network could yield information about what CIDs your node is requesting and/or reproviding and when. ## Enhancing your IPFS privacy @@ -48,7 +48,7 @@ Changing your reprovider settings to "pinned" or "roots" will keep your node fro ### Using a public gateway -Using a public [IPFS gateway](/how-to/address-ipfs-on-web/#http-gateways) is one way to request IPFS-hosted content without revealing any information about your local node — because you aren't using a local node! However, this method does keep you from enjoying all the benefits of being a full participant in the IPFS network. +Using a public [IPFS gateway](../how-to/address-ipfs-on-web.md#http-gateways) is one way to request IPFS-hosted content without revealing any information about your local node — because you aren't using a local node! However, this method does keep you from enjoying all the benefits of being a full participant in the IPFS network. Public IPFS gateways are primarily intended as a "bridge" between the legacy web and the distributed web; they allow ordinary web clients to request IPFS-hosted content via HTTP. That's great for back-compatibility, but if you only request content through public gateways rather than directly over IPFS, you're not actually part of the IPFS network; that gateway is the network participant, acting on your behalf. It's also important to remember that gateway operators could be collecting their own private metrics, which could include tracking the IP addresses that use a gateway and correlating those with what CIDs are requested. Additionally, content requested through a gateway is visible on the public DHT, although it's not possible to know _who_ requested it. @@ -64,10 +64,10 @@ If your privacy concerns are less about the potential for monitoring and more ab There's one caveat to keep in mind here: While today's encryption might seem bulletproof _today_, it's not guaranteed that it won't be broken at some point in the future. Future breakthroughs in computing might allow going back and decrypting older content that's been put on a public network such as IPFS. If you want to guard against this potential attack vector, using IPFS hybrid-private networks — in which nodes sit behind connection gates that check request ACLs before giving a node a request — is a potential design direction. (For more details, [this article from Pinata](https://medium.com/pinata/dedicated-ipfs-networks-c692d53f938d) may be helpful.) -If you're curious about implementing encryption with IPFS on a large scale, you may enjoy reading [this case study on Fleek, a fast-growing IPFS file hosting and delivery service](/concepts/case-study-fleek/). +If you're curious about implementing encryption with IPFS on a large scale, you may enjoy reading [this case study on Fleek, a fast-growing IPFS file hosting and delivery service](case-study-fleek.md). ### Creating a private network [Private IPFS networks](https://github.com/ipfs/go-ipfs/blob/release-v0.9.0/docs/experimental-features.md#private-networks) provide full protection from public monitoring but can lack the scale benefits provided by the public IPFS network. A private network operates identically to the public one, but with one critical difference: it can only be accessed by nodes that have been given access, and it will only ever scale to those nodes. This means that the benefits of the public IPFS network's massive scale, such as geographic resiliency and speedy retrieval of high-demand content, won't be realized unless the private network is explicitly designed and scaled with this in mind. -Running a private network can be a great option for corporate implementations of IPFS — for one example, see [this case study on Morpheus.Network](/concepts/case-study-morpheus/) — because the network's topology can be specified and built exactly as desired. +Running a private network can be a great option for corporate implementations of IPFS — for one example, see [this case study on Morpheus.Network](case-study-morpheus.md) — because the network's topology can be specified and built exactly as desired. diff --git a/docs/concepts/what-is-ipfs.md b/docs/concepts/what-is-ipfs.md index d1c857792..bc1035bcd 100644 --- a/docs/concepts/what-is-ipfs.md +++ b/docs/concepts/what-is-ipfs.md @@ -28,7 +28,7 @@ However, that's not the only option for meeting your aardvark needs! There's a m The easiest way to view the above link is by opening it in your browser through an _IPFS Gateway_. Simply add `https://ipfs.io` to the start of the above link and you'll be able to [view the page →](https://ipfs.io/ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Aardvark.html) ::: -IPFS knows how to find that sweet, sweet aardvark information by its [contents](/concepts/content-addressing/), not its location (more on that, which is called content addressing, below). The IPFS-ified version of the aardvark info is represented by that string of numbers in the middle of the URL (`QmXo…`), and instead of asking one of Wikipedia's computers for the page, your computer uses IPFS to ask lots of computers around the world to share the page with you. It can get your aardvark info from anyone who has it, not just Wikipedia. +IPFS knows how to find that sweet, sweet aardvark information by its [contents](content-addressing.md), not its location (more on that, which is called content addressing, below). The IPFS-ified version of the aardvark info is represented by that string of numbers in the middle of the URL (`QmXo…`), and instead of asking one of Wikipedia's computers for the page, your computer uses IPFS to ask lots of computers around the world to share the page with you. It can get your aardvark info from anyone who has it, not just Wikipedia. And, when you use IPFS, you don't just download files from someone else — your computer also helps distribute them. When your friend a few blocks away needs the same Wikipedia page, they might be as likely to get it from you as they would from your neighbor or anyone else using IPFS. @@ -56,7 +56,7 @@ What about that link to the aardvark page above? It looked a little unusual: /ipfs/QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco/wiki/Aardvark.html ``` -That jumble of letters after `/ipfs/` is called a [_content identifier_](/concepts/content-addressing/) and it’s how IPFS can get content from multiple places. +That jumble of letters after `/ipfs/` is called a [_content identifier_](content-addressing.md) and it’s how IPFS can get content from multiple places. Traditional URLs and file paths such as… @@ -66,10 +66,10 @@ Traditional URLs and file paths such as… …identify a file by _where it's located_ — what computer it's on and where on that computer's hard drive it is. That doesn't work if the file is in many places, though, like your neighbor's computer and your friend's across town. -Instead of being location-based, IPFS addresses a file by _what's in it_, or by its _content_. The content identifier above is a _cryptographic hash_ of the content at that address. The hash is unique to the content that it came from, even though it may look short compared to the original content. It also allows you to verify that you got what you asked for — bad actors can't just hand you content that doesn't match. (If hashes are new to you, check out [the concept guide on hashes](/concepts/hashing/) for an introduction.) +Instead of being location-based, IPFS addresses a file by _what's in it_, or by its _content_. The content identifier above is a _cryptographic hash_ of the content at that address. The hash is unique to the content that it came from, even though it may look short compared to the original content. It also allows you to verify that you got what you asked for — bad actors can't just hand you content that doesn't match. (If hashes are new to you, check out [the concept guide on hashes](hashing.md) for an introduction.) ::: tip NOTE -Why do we say "content" instead of "files" or "web pages" here? Because a content identifier can point to many different types of data, such as a single small file, a piece of a larger file, or metadata. (In case you don't know, metadata is "data about the data." You use metadata when you access the date, location, or file size of your digital pictures, for example.) So, an individual IPFS address can refer to the metadata of just a single piece of a file, a whole file, a directory, a whole website, or any other kind of content. For more on this, check out our guide to [how IPFS works](/concepts/how-ipfs-works/). +Why do we say "content" instead of "files" or "web pages" here? Because a content identifier can point to many different types of data, such as a single small file, a piece of a larger file, or metadata. (In case you don't know, metadata is "data about the data." You use metadata when you access the date, location, or file size of your digital pictures, for example.) So, an individual IPFS address can refer to the metadata of just a single piece of a file, a whole file, a directory, a whole website, or any other kind of content. For more on this, check out our guide to [how IPFS works](how-ipfs-works.md). ::: Because the address of a file in IPFS is created from the content itself, links in IPFS can't be changed. For example ... @@ -77,7 +77,7 @@ Because the address of a file in IPFS is created from the content itself, links - If the text on a web page is changed, the new version gets a new, different address. - Content can't be moved to a different address. On today's internet, a company could reorganize content on their website and move a page at `http://mycompany.com/what_we_do` to `http://mycompany.com/services`. In IPFS, the old link you have would still point to the same old content. -Of course, people want to update and change content all the time and don't want to send new links every time they do it. This is entirely possible in an IPFS world, but explaining it requires a little more info than what's within the scope of this IPFS introduction. Check out the concept guides on [IPNS](/concepts/ipns/), the [Mutable File System (MFS)](/concepts/file-systems/#mutable-file-system-mfs), and [DNSLink](/concepts/dnslink/) to learn more about how changing content can work in a content-addressed, distributed system. +Of course, people want to update and change content all the time and don't want to send new links every time they do it. This is entirely possible in an IPFS world, but explaining it requires a little more info than what's within the scope of this IPFS introduction. Check out the concept guides on [IPNS](ipns.md), the [Mutable File System (MFS)](file-systems.md#mutable-file-system-mfs), and [DNSLink](dnslink.md) to learn more about how changing content can work in a content-addressed, distributed system. It's important to remember in all of these situations, using IPFS is participatory and collaborative. If nobody using IPFS has the content identified by a given address available for others to access, you won't be able to get it. On the other hand, content can't be removed from IPFS as long as _someone_ is interested enough to make it available, whether that person is the original author or not. Note that this is similar to the current web, where it is also impossible to remove content that's been copied across an unknowable number of websites; the difference with IPFS is that you are always able to find those copies. @@ -85,6 +85,6 @@ It's important to remember in all of these situations, using IPFS is participato While there's lots of complex technology in IPFS, the fundamental ideas are about changing how networks of people and computers communicate. Today's World Wide Web is structured on _ownership_ and _access_, meaning that you get files from whoever owns them — if they choose to grant you access. IPFS is based on the ideas of _possession_ and _participation_, where many people _possess_ each others' files and _participate_ in making them available. -That means IPFS only works well when people are actively participating. If you use your computer to share files using IPFS, but then you turn your computer off, other people won't be able to get those files from you anymore. But if you or others make sure that copies of those files are stored on more than one computer that's powered on and running IPFS, those files will be more reliably available to other IPFS users who want them. This happens to some extent automatically: by default, your computer shares a file with others for a limited time after you've downloaded it using IPFS. You can also make content available more permanently by _pinning_ it, which saves it to your computer and makes it available on the IPFS network until you decide to _unpin_ it. (You can learn more about this in our [guide to persistence and pinning](/concepts/persistence).) +That means IPFS only works well when people are actively participating. If you use your computer to share files using IPFS, but then you turn your computer off, other people won't be able to get those files from you anymore. But if you or others make sure that copies of those files are stored on more than one computer that's powered on and running IPFS, those files will be more reliably available to other IPFS users who want them. This happens to some extent automatically: by default, your computer shares a file with others for a limited time after you've downloaded it using IPFS. You can also make content available more permanently by _pinning_ it, which saves it to your computer and makes it available on the IPFS network until you decide to _unpin_ it. (You can learn more about this in our [guide to persistence and pinning](persistence.md).) If you want to make sure one of your own files is permanently shared on the internet today, you might use a for-pay file-sharing service like Dropbox. Some people have begun offering similar services based on IPFS called _pinning services_. But since IPFS makes this kind of sharing a built-in feature, you can also collaborate with friends or partner with institutions (for example, museums and libraries might work together) to share each others' files. We hope IPFS can be the low-level tool that allows a rich fabric of communities, business, and cooperative organizations to all form a distributed web that is much more reliable, robust, and equitable than the one we have today. diff --git a/docs/how-to/README.md b/docs/how-to/README.md index e49f83698..84a442ff0 100644 --- a/docs/how-to/README.md +++ b/docs/how-to/README.md @@ -14,13 +14,13 @@ No matter what you're looking to do with IPFS, you can find how-tos and tutorial See the site navigation menu for all our how-tos, organized by topic area, including favorites like these: -- **Customize your install** by [configuring a node](/how-to/configure-node/), modifying the [bootstrap list](/how-to/modify-bootstrap-list/), and more -- **Learn how to manage files** in IPFS with tutorials on concepts like [pinning](/how-to/pin-files/), how to [work with blocks](/how-to/work-with-blocks/), learning how to [troubleshoot file transfers](https://github.com/ipfs/go-ipfs/blob/master/docs/file-transfer.md), and understanding [working with large datasets](https://github.com/ipfs/archives/tree/master/tutorials/replicating-large-datasets) +- **Customize your install** by [configuring a node](configure-node.md), modifying the [bootstrap list](modify-bootstrap-list.md), and more +- **Learn how to manage files** in IPFS with tutorials on concepts like [pinning](pin-files.md), how to [work with blocks](work-with-blocks.md), learning how to [troubleshoot file transfers](https://github.com/ipfs/go-ipfs/blob/master/docs/file-transfer.md), and understanding [working with large datasets](https://github.com/ipfs/archives/tree/master/tutorials/replicating-large-datasets) - **See how to work with peers** using methods like [customizing libp2p bundles](https://github.com/ipfs/js-ipfs/tree/master/examples/custom-libp2p) and [using circuit relay](https://github.com/ipfs/js-ipfs/tree/master/examples/circuit-relaying) -- **Understand website hosting** by starting with how to [host a simple single-page site](/how-to/websites-on-ipfs/single-page-website/) +- **Understand website hosting** by starting with how to [host a simple single-page site](websites-on-ipfs/single-page-website.md) - **Work with blockchains** like the [Ethereum](https://github.com/ipfs/js-ipfs/tree/master/examples/explore-ethereum-blockchain) chain - **Learn how to build apps** on IPFS, starting with [exploring the IPFS API](https://github.com/ipfs/camp/tree/master/CORE_AND_ELECTIVE_COURSES/CORE_COURSE_C) and [making a basic libp2p app](https://github.com/ipfs/camp/tree/master/CORE_AND_ELECTIVE_COURSES/CORE_COURSE_B) -- **Understand how IPFS works in the browser** by learning how to [address IPFS on the Web](/how-to/address-ipfs-on-web/), seeing how to [exchange files between nodes](https://github.com/ipfs/js-ipfs/tree/master/examples/browser-exchange-files), seeing [how IPFS can be used in your favorite browser tools and frameworks](/how-to/browser-tools-frameworks/), and more +- **Understand how IPFS works in the browser** by learning how to [address IPFS on the Web](address-ipfs-on-web.md), seeing how to [exchange files between nodes](https://github.com/ipfs/js-ipfs/tree/master/examples/browser-exchange-files), seeing [how IPFS can be used in your favorite browser tools and frameworks](browser-tools-frameworks.md), and more ## Don't see what you're looking for? diff --git a/docs/how-to/address-ipfs-on-web.md b/docs/how-to/address-ipfs-on-web.md index 2428349e3..0d77212c1 100644 --- a/docs/how-to/address-ipfs-on-web.md +++ b/docs/how-to/address-ipfs-on-web.md @@ -30,7 +30,7 @@ You can swap out `ipfs.io` for your own http-to-ipfs gateway, but you are then o ## HTTP gateways -Gateways are provided strictly for convenience: in other words, they help tools that speak HTTP but do not speak distributed protocols (such as IPFS) to communicate. They are the first stage of the upgrade path for the web. [More information about IPFS Gateways](/concepts/ipfs-gateway/). +Gateways are provided strictly for convenience: in other words, they help tools that speak HTTP but do not speak distributed protocols (such as IPFS) to communicate. They are the first stage of the upgrade path for the web. [More information about IPFS Gateways](../concepts/ipfs-gateway.md). ### Centralization @@ -83,7 +83,7 @@ https://ipfs.io/ipns/tr.wikipedia-on-ipfs.org/wiki/Anasayfa.html ### Subdomain gateway -When [origin-based security](https://en.wikipedia.org/wiki/Same-origin_policy) is needed, [CIDv1](/concepts/content-addressing/#identifier-formats) in case-insensitive encoding such as Base32 or Base36 should be used in the subdomain: +When [origin-based security](https://en.wikipedia.org/wiki/Same-origin_policy) is needed, [CIDv1](../concepts/content-addressing.md#identifier-formats) in case-insensitive encoding such as Base32 or Base36 should be used in the subdomain: https://.ipfs..tld/path/to/resource @@ -155,7 +155,7 @@ k2k4r8jl0yz8qjgqbmc2cdu5hkqek5rj6flgnlkyywynci20j0iuyfuj ### DNSLink gateway -The gateway provided by the IPFS daemon understands the `Host` header present in HTTP requests, and will check if [DNSLink](/guides/concepts/dnslink) exists for a specified [domain name](https://en.wikipedia.org/wiki/Fully_qualified_domain_name). +The gateway provided by the IPFS daemon understands the `Host` header present in HTTP requests, and will check if [DNSLink](../concepts/dnslink.md) exists for a specified [domain name](https://en.wikipedia.org/wiki/Fully_qualified_domain_name). If DNSLink is present, the gateway will return content from a path resolved via DNS TXT record. This type of gateway provides full [origin isolation](https://en.wikipedia.org/wiki/Same-origin_policy). diff --git a/docs/how-to/best-practices-for-nft-data.md b/docs/how-to/best-practices-for-nft-data.md index 9324a9320..191adf0c2 100644 --- a/docs/how-to/best-practices-for-nft-data.md +++ b/docs/how-to/best-practices-for-nft-data.md @@ -42,7 +42,7 @@ const cid = await ipfs.add({ content }, { }) ``` -If you already have a version 0 CID for your content, there's no need to add it to IPFS again just to get the new CID format! You can convert a v0 CID to v1 using [the ipfs command line](/how-to/address-ipfs-on-web/#manual-use-cid-ipfs-io-or-the-command-line) or on the web at [cid.ipfs.io](https://cid.ipfs.io). If you're not sure which version you have, it's easy to tell the difference. Version 0 CIDs are always 46 characters long, starting with `Qm`. +If you already have a version 0 CID for your content, there's no need to add it to IPFS again just to get the new CID format! You can convert a v0 CID to v1 using [the ipfs command line](address-ipfs-on-web.md#manual-use-cid-ipfs-io-or-the-command-line) or on the web at [cid.ipfs.io](https://cid.ipfs.io). If you're not sure which version you have, it's easy to tell the difference. Version 0 CIDs are always 46 characters long, starting with `Qm`. ::: tip You can learn more about CIDs in our [guide to Content Addressing][docs-cid], or by following the [interactive tutorials on ProtoSchool][protoschool-cid]. diff --git a/docs/how-to/command-line-quick-start.md b/docs/how-to/command-line-quick-start.md index 2cff45ce6..d2095af27 100644 --- a/docs/how-to/command-line-quick-start.md +++ b/docs/how-to/command-line-quick-start.md @@ -14,7 +14,7 @@ Don’t want to use the command line right now? Give the desktop-app implementat ## Prerequisites -If you have not yet installed Go-IPFS, follow the [install instructions](../../install/command-line). +If you have not yet installed Go-IPFS, follow the [install instructions](../install/command-line.md). ## Initialize the repository @@ -177,4 +177,4 @@ You need to install and set up FUSE in order to mount the file system. For more ### Further help -The IPFS community is friendly and able to help! Get support from other IPFS developers in the official [IPFS forums](https://discuss.ipfs.io/), or join the conversation on [Matrix](/community/chat/). +The IPFS community is friendly and able to help! Get support from other IPFS developers in the official [IPFS forums](https://discuss.ipfs.io/), or join the conversation on [Matrix](../community/chat.md). diff --git a/docs/how-to/companion-node-types.md b/docs/how-to/companion-node-types.md index cb9f7e2e1..c770ca7e4 100644 --- a/docs/how-to/companion-node-types.md +++ b/docs/how-to/companion-node-types.md @@ -13,7 +13,7 @@ IPFS Companion's preferences screen allows you to choose from several different **If you're already running a local IPFS node, choose _External_.** If not, do one of the following: -- [Install](/install) and run IPFS as an [external node](#external) (recommended). +- [Install](../install/README.md) and run IPFS as an [external node](#external) (recommended). - Use a [native node](#native) built into your browser (Brave v1.19 or later only) or the [embedded node](#embedded) built into Companion. ## External @@ -34,7 +34,7 @@ A good practice is to run your go-ipfs daemon on localhost (`127.0.0.1`), as it You can get started with running a go-ipfs node on your local machine in several ways: - [IPFS Desktop](https://github.com/ipfs-shipyard/ipfs-desktop) installs and manages a local node for you, as well as offering an easy, convenient user interface for managing files and peers. -- If you're comfortable with the command line and don't need the convenience of the IPFS Desktop UI, follow the directions in the [command line quick-start guide](/how-to/command-line-quick-start/). +- If you're comfortable with the command line and don't need the convenience of the IPFS Desktop UI, follow the directions in the [command line quick-start guide](command-line-quick-start.md). - Docker fans can run and use go-ipfs from [inside a Docker container](https://github.com/ipfs/go-ipfs#running-ipfs-inside-docker). ## Native diff --git a/docs/how-to/configure-node.md b/docs/how-to/configure-node.md index 9133284f3..9bafb6b41 100644 --- a/docs/how-to/configure-node.md +++ b/docs/how-to/configure-node.md @@ -539,7 +539,7 @@ Type: `array[string]` A boolean to configure whether the gateway at the hostname provides [Origin isolation](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy) between content roots. -- `true` - enables [subdomain gateway](#https://docs.ipfs.io/how-to/address-ipfs-on-web/#subdomain-gateway) at `http://*.{hostname}/` +- `true` - enables [subdomain gateway](address-ipfs-on-web.md#subdomain-gateway) at `http://*.{hostname}/` - **Requires whitelist:** make sure respective `Paths` are set. For example, `Paths: ["/ipfs", "/ipns"]` are required for `http://{cid}.ipfs.{hostname}` and `http://{foo}.ipns.{hostname}` to work: @@ -547,7 +547,7 @@ between content roots. - **Backward-compatible:** requests for content paths such as `http://{hostname}/ipfs/{cid}` produce redirect to `http://{cid}.ipfs.{hostname}` - **API:** if `/api` is on the `Paths` whitelist, `http://{hostname}/api/{cmd}` produces redirect to `http://api.{hostname}/api/{cmd}` -- `false` - enables [path gateway](https://docs.ipfs.io/how-to/address-ipfs-on-web/#path-gateway) at `http://{hostname}/*` +- `false` - enables [path gateway](address-ipfs-on-web.md#path-gateway) at `http://{hostname}/*` - Example: `json "Gateway": { "PublicGateways": { "ipfs.io": { "UseSubdomains": false, "Paths": ["/ipfs", "/ipns", "/api"], } } } ` @@ -596,7 +596,7 @@ $ ipfs config --json Gateway.PublicGateways '{"localhost": null }' Below is a list of the most common public gateway setups. -- Public [subdomain gateway](https://docs.ipfs.io/how-to/address-ipfs-on-web/#subdomain-gateway) at `http://{cid}.ipfs.dweb.link` (each content root gets its own Origin) +- Public [subdomain gateway](address-ipfs-on-web.md#subdomain-gateway) at `http://{cid}.ipfs.dweb.link` (each content root gets its own Origin) ```shell $ ipfs config --json Gateway.PublicGateways '{ @@ -615,7 +615,7 @@ Below is a list of the most common public gateway setups. **X-Forwarded-Host:** we also support `X-Forwarded-Host: example.com` if you want to override subdomain gateway host from the original request: `http://dweb.link/ipfs/{cid}` → `http://{cid}.ipfs.example.com` -- Public [path gateway](https://docs.ipfs.io/how-to/address-ipfs-on-web/#path-gateway) at `http://ipfs.io/ipfs/{cid}` (no Origin separation) +- Public [path gateway](address-ipfs-on-web.md#path-gateway) at `http://ipfs.io/ipfs/{cid}` (no Origin separation) ```shell $ ipfs config --json Gateway.PublicGateways '{ @@ -634,7 +634,7 @@ Below is a list of the most common public gateway setups. - Note that `NoDNSLink: false` is the default (it works out of the box unless set to `true` manually) -- Hardened, site-specific [DNSLink gateway](https://docs.ipfs.io/how-to/address-ipfs-on-web/#dnslink-gateway). +- Hardened, site-specific [DNSLink gateway](address-ipfs-on-web.md#dnslink-gateway). Disable fetching of remote data (`NoFetch: true`) and resolving DNSLink at unknown hostnames (`NoDNSLink: true`). Then, enable DNSLink gateway only for the specific hostname (for which data diff --git a/docs/how-to/exchange-files-between-nodes.md b/docs/how-to/exchange-files-between-nodes.md index b1a41795d..4d2363b7d 100644 --- a/docs/how-to/exchange-files-between-nodes.md +++ b/docs/how-to/exchange-files-between-nodes.md @@ -42,7 +42,7 @@ You must have the following installed: - [Node.js](https://nodejs.org/en/) - [NPM](https://www.npmjs.com/) - [Bundle](https://www.npmjs.com/package/bundle-js) -- [IPFS](/install) +- [IPFS](../install/README.md) ## Set up diff --git a/docs/how-to/host-single-page-site.md b/docs/how-to/host-single-page-site.md index 5ca906219..c86fdd180 100644 --- a/docs/how-to/host-single-page-site.md +++ b/docs/how-to/host-single-page-site.md @@ -9,14 +9,14 @@ description: Learn how to host a simple single-page website on the decentralized A great way to get to know IPFS is to use it to host a simple, single-page website. Here's a step-by-step guide to doing just that. ::: tip -We've put together a series of tutorials to walk you through hosting a full website on IPFS. [Take a look!](/how-to/websites-on-ipfs/single-page-website) +We've put together a series of tutorials to walk you through hosting a full website on IPFS. [Take a look!](websites-on-ipfs/single-page-website.md) ::: ## Create your site Assume you have a static website in a directory `mysite`. -In order to publish it as a site, [install IPFS](/install/) and make sure your IPFS daemon is running: +In order to publish it as a site, [install IPFS](../install/README.md) and make sure your IPFS daemon is running: ```bash $ ipfs daemon @@ -46,7 +46,7 @@ Those hashes are difficult to remember. Let's look at some ways to get rid of th Assume you have the domain name `your.domain` and can access your registrar's control panel to manage DNS entries for it. -Create a DNS TXT record ([DNSLink](/concepts/dnslink/)), with the key `your.domain.` and the value `dnslink=/ipfs/$SITE_CID` where `$SITE_CID` is the value from the section above. +Create a DNS TXT record ([DNSLink](../concepts/dnslink.md)), with the key `your.domain.` and the value `dnslink=/ipfs/$SITE_CID` where `$SITE_CID` is the value from the section above. Once you've created that record, and it has propagated you should be able to find it. @@ -65,7 +65,7 @@ More questions about DNSLink? Check out the [DNSLink website](http://dnslink.io/ Each time you change your website, you will have to republish it, update the DNS TXT record with the new value of `$SITE_CID` and wait for it to propagate. -You can get around that limitation by using IPNS, the [InterPlanetary Naming System](/concepts/ipns/). +You can get around that limitation by using IPNS, the [InterPlanetary Naming System](../concepts/ipns.md). You might have noticed `/ipns/` instead of `/ipfs/` in the updated links in the previous section. diff --git a/docs/how-to/make-service.md b/docs/how-to/make-service.md index 4a7d96efe..7f54b51b7 100644 --- a/docs/how-to/make-service.md +++ b/docs/how-to/make-service.md @@ -9,7 +9,7 @@ description: Learn how to build an easy demo service on IPFS. This example is outdated and should only be used as reference. Several steps on this page are either no longer applicable, or cause errors with IPFS. This page has been removed from the sidebar navigation. ::: -IPFS has a few default services that it runs by default, such as [the DHT](/concepts/dht/), [Bitswap](/concepts/bitswap/), and the diagnostics service. Each of these simply registers a handler on the IPFS PeerHost, and listens on it for new connections. The `corenet` package has a very clean interface to this functionality. So let's try building an easy demo service to try this out! +IPFS has a few default services that it runs by default, such as [the DHT](../concepts/dht.md), [Bitswap](../concepts/bitswap.md), and the diagnostics service. Each of these simply registers a handler on the IPFS PeerHost, and listens on it for new connections. The `corenet` package has a very clean interface to this functionality. So let's try building an easy demo service to try this out! Let's start by building the service host: diff --git a/docs/how-to/pin-files.md b/docs/how-to/pin-files.md index cd0aeb96d..7e9ebd0e2 100644 --- a/docs/how-to/pin-files.md +++ b/docs/how-to/pin-files.md @@ -8,7 +8,7 @@ description: Learn how to pin files in IPFS in order to keep your files and othe Pinning is a very important concept in IPFS. IPFS semantics try to make it feel like every single object is local — there is no "retrieve this file for me from a remote server", just `ipfs cat` or `ipfs get`, which act the same way no matter where the actual object is located. -While this is nice, sometimes you want to be able to control what you keep around. **Pinning** is the mechanism that allows you to tell IPFS to always keep a given object somewhere — the default being your local node, though this can be different if you use a [third-party remote pinning service](/how-to/work-with-pinning-services/). IPFS has a fairly aggressive caching mechanism that will keep an object local for a short time after you perform any IPFS operation on it, but these objects may get garbage-collected regularly. To prevent that garbage collection, simply pin the CID you care about, or add it to [MFS](/concepts/file-systems/#mutable-file-system-mfs). Objects added through `ipfs add` are pinned recursively by default. Things in MFS are not pinned by default, but are protected from garbage-collection, so one can think about MFS as a mechanism for implicit pinning. +While this is nice, sometimes you want to be able to control what you keep around. **Pinning** is the mechanism that allows you to tell IPFS to always keep a given object somewhere — the default being your local node, though this can be different if you use a [third-party remote pinning service](work-with-pinning-services.md). IPFS has a fairly aggressive caching mechanism that will keep an object local for a short time after you perform any IPFS operation on it, but these objects may get garbage-collected regularly. To prevent that garbage collection, simply pin the CID you care about, or add it to [MFS](../concepts/file-systems.md#mutable-file-system-mfs). Objects added through `ipfs add` are pinned recursively by default. Things in MFS are not pinned by default, but are protected from garbage-collection, so one can think about MFS as a mechanism for implicit pinning. Let's look at this example to explore pinning to your local IPFS node in a bit more depth: @@ -53,8 +53,6 @@ While you can use a remote pinning service's own GUI, CLI, or other dev tools to - The [IPFS Pinning Service API](https://ipfs.github.io/pinning-services-api-spec/) offers a specification that enables developers to integrate any pinning service that supports the spec, or create their own. Thanks to the OpenAPI spec format, both clients and servers can be [generated](https://github.com/ipfs/pinning-services-api-spec#code-generation) from the YAML spec file. -- If you use go-ipfs 0.8+ from the command line, you have access to `ipfs pin remote` commands acting as a client for interacting with pinning service APIs. Add your favorite pinning service(s), pin CIDs under human-readable names, get pin statuses, and more, straight from the CLI. [Learn how →](/how-to/work-with-pinning-services/) +- If you use go-ipfs 0.8+ from the command line, you have access to `ipfs pin remote` commands acting as a client for interacting with pinning service APIs. Add your favorite pinning service(s), pin CIDs under human-readable names, get pin statuses, and more, straight from the CLI. [Learn how →](work-with-pinning-services.md) - +- [IPFS Desktop](https://github.com/ipfs-shipyard/ipfs-desktop) and its equivalent in-browser IPFS web interface, the [IPFS Web UI](https://github.com/ipfs-shipyard/ipfs-webui), both support remote pinning services, so you can pin to your favorite pinning service(s) straight from the UI. [Learn how →](work-with-pinning-services.md) diff --git a/docs/how-to/websites-on-ipfs/introducing-fleek.md b/docs/how-to/websites-on-ipfs/introducing-fleek.md index 9901592da..ba5f32555 100644 --- a/docs/how-to/websites-on-ipfs/introducing-fleek.md +++ b/docs/how-to/websites-on-ipfs/introducing-fleek.md @@ -54,4 +54,4 @@ Fleek allows you to configure your domain names with your sites on IPFS! No more ## Up next -For the final tutorial in this series, we're going to take a quick look at [static-site generators, and how to host them on IPFS](../static-site-generators). +For the final tutorial in this series, we're going to take a quick look at [static-site generators, and how to host them on IPFS](static-site-generators.md). diff --git a/docs/how-to/websites-on-ipfs/link-a-domain.md b/docs/how-to/websites-on-ipfs/link-a-domain.md index 07df7dc58..0a4744dab 100644 --- a/docs/how-to/websites-on-ipfs/link-a-domain.md +++ b/docs/how-to/websites-on-ipfs/link-a-domain.md @@ -118,4 +118,4 @@ In a few minutes, you'll be able to go to `Your_Domain.eth/` and view your websi ## Up next -In the next tutorial in this series, we'll take a look at a tool that will help make this whole process easier: [Fleek](/how-to/websites-on-ipfs/introducing-fleek). +In the next tutorial in this series, we'll take a look at a tool that will help make this whole process easier: [Fleek](introducing-fleek.md). diff --git a/docs/how-to/websites-on-ipfs/single-page-website.md b/docs/how-to/websites-on-ipfs/single-page-website.md index 7f48c848e..c5a6f0db1 100644 --- a/docs/how-to/websites-on-ipfs/single-page-website.md +++ b/docs/how-to/websites-on-ipfs/single-page-website.md @@ -211,7 +211,7 @@ IPFS collaborative clusters are groups of IPFS nodes that collaboratively pin al ### Pinning services -An easy way to make sure important data is retained is to use a pinning service. These services run lots of IPFS nodes and will _pin_ your data for you! This way, you don't have to run and maintain your own IPFS node. Check out the [Persistence page](/concepts/persistence) for more information on pinning services. In this tutorial, we're going to use [Pinata](https://pinata.cloud/) since it gives new users 1GB of storage for free, and has a very simple interface: +An easy way to make sure important data is retained is to use a pinning service. These services run lots of IPFS nodes and will _pin_ your data for you! This way, you don't have to run and maintain your own IPFS node. Check out the [Persistence page](../../concepts/persistence.md) for more information on pinning services. In this tutorial, we're going to use [Pinata](https://pinata.cloud/) since it gives new users 1GB of storage for free, and has a very simple interface: 1. Go to [Pinata.cloud](https://pinata.cloud/) and sign up or log in. 2. Click **Pinata Upload**. @@ -254,4 +254,4 @@ Domain name services are fairly slow to update. You should be able to go to your This project was designed to get you up and running quickly, but there are many improvements we can make here. -You may have noticed that when visiting [randomplanetfacts.xyz](http://randomplanetfacts.xyz), your browser redirects to [gateway.pinata.cloud/ipfs/QmW7S5HR...](https://gateway.pinata.cloud/ipfs/QmW7S5HRLkP4XtPNyT1vQSjP3eRdtZaVtF6FAPvUfduMjA). This isn't great for the user's experience, and it can cause issues with security certificates and other website validation methods. Also, this website is incredibly simple. There are no images, external stylesheets, or javascript files. If you're interested in building a more complex site using IPFS and securing it properly, [carry on with this tutorial series by hosting a multipage website on IPFS.](/how-to/websites-on-ipfs/multipage-website) +You may have noticed that when visiting [randomplanetfacts.xyz](http://randomplanetfacts.xyz), your browser redirects to [gateway.pinata.cloud/ipfs/QmW7S5HR...](https://gateway.pinata.cloud/ipfs/QmW7S5HRLkP4XtPNyT1vQSjP3eRdtZaVtF6FAPvUfduMjA). This isn't great for the user's experience, and it can cause issues with security certificates and other website validation methods. Also, this website is incredibly simple. There are no images, external stylesheets, or javascript files. If you're interested in building a more complex site using IPFS and securing it properly, [carry on with this tutorial series by hosting a multipage website on IPFS.](multipage-website.md) diff --git a/docs/how-to/work-with-pinning-services.md b/docs/how-to/work-with-pinning-services.md index 140461c65..cfbfd0a5d 100644 --- a/docs/how-to/work-with-pinning-services.md +++ b/docs/how-to/work-with-pinning-services.md @@ -5,7 +5,7 @@ description: Learn how to use or create remote pinning services with IPFS, the I # Work with remote pinning services -Depending on how you use IPFS, you might find it helpful to use a **remote pinning service** instead of, or in addition to, pinning files on your local IPFS node. Whether it happens remotely or locally, **pinning** an item in IPFS identifies it as something you always wish to keep available, exempting it from the routine _garbage collection_ that IPFS does on infrequently-used items in order to efficiently manage storage space. [Learn more about local pinning →](/how-to/pin-files) +Depending on how you use IPFS, you might find it helpful to use a **remote pinning service** instead of, or in addition to, pinning files on your local IPFS node. Whether it happens remotely or locally, **pinning** an item in IPFS identifies it as something you always wish to keep available, exempting it from the routine _garbage collection_ that IPFS does on infrequently-used items in order to efficiently manage storage space. [Learn more about local pinning →](pin-files.md) If you've got just one local IPFS node that's always running, local pinning may be all you need to ensure your important items are persisted and never garbage-collected. However, using a remote pinning service — or creating your own — might be useful to you if: @@ -24,8 +24,6 @@ As of January 2021, [Pinata](https://pinata.cloud/) supports the [IPFS Pinning S To add and use a remote pinning service directly in IPFS, you'll first need to have an account with that service. Once you've got an account, follow these steps to add and use it: - diff --git a/docs/install/command-line.md b/docs/install/command-line.md index 0dcd7c534..3c6540ea4 100644 --- a/docs/install/command-line.md +++ b/docs/install/command-line.md @@ -11,7 +11,7 @@ Installing IPFS through the command-line is handy if you plan on building applic ## System requirements -IPFS requires 512MiB of memory and can run an IPFS node on a Raspberry Pi. However, how much disk space your IPFS installation takes up depends on how much data you're sharing. A base installation takes up about 12MB of disk space, and the [default maximum disk storage](/how-to/configure-node) is set to 10GB. +IPFS requires 512MiB of memory and can run an IPFS node on a Raspberry Pi. However, how much disk space your IPFS installation takes up depends on how much data you're sharing. A base installation takes up about 12MB of disk space, and the [default maximum disk storage](../how-to/configure-node.md) is set to 10GB. ## Official distributions @@ -158,4 +158,4 @@ Manually compiling IPFS is a fairly involved process that changes frequently. It ## Next steps -Now that you've got an IPFS node installed, you can start building applications and services on top of the network! Check out the Command-line- quicks start guide and jump straight to the [Initialize the repository section](http://docs.ipfs.io/how-to/command-line-quick-start/#initialize-the-repository). +Now that you've got an IPFS node installed, you can start building applications and services on top of the network! Check out the Command-line- quicks start guide and jump straight to the [Initialize the repository section](../how-to/command-line-quick-start.md#initialize-the-repository). diff --git a/docs/install/ipfs-companion.md b/docs/install/ipfs-companion.md index 3ef0db54c..27f9f32fd 100644 --- a/docs/install/ipfs-companion.md +++ b/docs/install/ipfs-companion.md @@ -7,7 +7,7 @@ description: The IPFS Companion browser extension allows you to interact with yo IPFS Companion allows you to interact with your IPFS node and the extended IPFS network through your browser. The add-on is available for Brave, Chrome, Edge, Firefox, and Opera. It enables support for `ipfs://` addresses, automatically loads websites and file paths from an IPFS gateway, allows you to easily import and share a file with IPFS, and more. -IPFS Companion works in tandem with an IPFS node running on your local machine, so make sure you have a [node installed](/install/ipfs-desktop/) before installing this add-on. +IPFS Companion works in tandem with an IPFS node running on your local machine, so make sure you have a [node installed](ipfs-desktop.md) before installing this add-on. ## Install diff --git a/docs/install/ipfs-desktop.md b/docs/install/ipfs-desktop.md index 52cacbbaf..2af74af79 100644 --- a/docs/install/ipfs-desktop.md +++ b/docs/install/ipfs-desktop.md @@ -126,5 +126,5 @@ While these instructions are specific to Ubuntu, they will likely work with most ## Next steps -Now that you've got IPFS Desktop installed, you can start sharing files and interacting with other nodes on the network! Check out how to [host a website using IPFS →](/how-to/websites-on-ipfs/single-page-website/) +Now that you've got IPFS Desktop installed, you can start sharing files and interacting with other nodes on the network! Check out how to [host a website using IPFS →](../how-to/websites-on-ipfs/single-page-website.md) diff --git a/docs/project/README.md b/docs/project/README.md index b6044a170..773f10498 100644 --- a/docs/project/README.md +++ b/docs/project/README.md @@ -9,7 +9,7 @@ Curious about how it all got started, or where we're headed? Learn about the his ## History of IPFS -Want to know how it all began? Learn the [history of the IPFS project](/project/history/). +Want to know how it all began? Learn the [history of the IPFS project](history.md). ## Repository guide @@ -21,7 +21,7 @@ See the overall roadmap of [IPFS project requirements](https://github.com/ipfs/r ## Implementation status -Want to know the current state of your favorite IPFS feature? See the [current implementation status](/project/implementation-status) for go-ipfs and js-ipfs, listed by commands and endpoints. +Want to know the current state of your favorite IPFS feature? See the [current implementation status](implementation-status.md) for go-ipfs and js-ipfs, listed by commands and endpoints. ## IPFS specifications @@ -37,11 +37,11 @@ See how IPFS team planning, management and coordination happens, and learn how t ## Related projects -IPFS is a highly modular project that is itself made out of many different protocols and tools. Learn more about the [IPFS-related projects](/project/related-projects/) under the overall support of Protocol Labs. +IPFS is a highly modular project that is itself made out of many different protocols and tools. Learn more about the [IPFS-related projects](related-projects.md) under the overall support of Protocol Labs. ## Contribute to IPFS -Thousands of people contribute to IPFS from all over the world — and that can include you! No matter your areas of interest or expertise, there are a number of ways that you can make an impact on the future of the Internet by [contributing to IPFS](/project/contribute/). +Thousands of people contribute to IPFS from all over the world — and that can include you! No matter your areas of interest or expertise, there are a number of ways that you can make an impact on the future of the Internet by [contributing to IPFS](contribute.md). ## Code of conduct diff --git a/docs/reference/README.md b/docs/reference/README.md index fd6b613d1..7bd95a47d 100644 --- a/docs/reference/README.md +++ b/docs/reference/README.md @@ -10,18 +10,18 @@ Looking for developer references for IPFS? Find them here. ## Go (go-ipfs) -[API resources for go-ipfs](/reference/go/api/) (the reference implementation of IPFS), including the Go CoreAPI, the Go embedded client, and the experimental Go CoreAPI implementation using HTTP API. +[API resources for go-ipfs](go/api.md) (the reference implementation of IPFS), including the Go CoreAPI, the Go embedded client, and the experimental Go CoreAPI implementation using HTTP API. ## JavaScript (js-ipfs) -[API resources for js-ipfs](/reference/js/api/), including the JS core API reference and the JS HTTP client library. +[API resources for js-ipfs](js/api.md), including the JS core API reference and the JS HTTP client library. Explore the Mutable File System, Regular Files API, and DAG API through ProtoSchool's [coding challenges](https://proto.school/course/ipfs). ## HTTP -[HTTP API reference](http/api) for IPFS — control your node using the same commands you can from the command line! +[HTTP API reference](http/api.md) for IPFS — control your node using the same commands you can from the command line! ## CLI commands -Working in the terminal? Here's where you'll find the IPFS [command-line interface (CLI) reference](/reference/cli/). +Working in the terminal? Here's where you'll find the IPFS [command-line interface (CLI) reference](cli.md). diff --git a/docs/reference/cli.md b/docs/reference/cli.md index 02af1d397..08d524cee 100644 --- a/docs/reference/cli.md +++ b/docs/reference/cli.md @@ -7,13 +7,13 @@ description: API documentation for the Go-IPFS command-line executable. -IPFS can run in either _online_ or _offline_ mode. Online mode is when you have IPFS running separately as a daemon process. If you do not have an IPFS daemon running, you are in offline mode. Some commands, like `ipfs swarm peers`, are only supported when online. The [command-line quickstart guide](../how-to/command-line-quick-start/#take-your-node-online) explains how to start the IPFS daemon and take your node online. +IPFS can run in either _online_ or _offline_ mode. Online mode is when you have IPFS running separately as a daemon process. If you do not have an IPFS daemon running, you are in offline mode. Some commands, like `ipfs swarm peers`, are only supported when online. The [command-line quickstart guide](../how-to/command-line-quick-start.md#take-your-node-online) explains how to start the IPFS daemon and take your node online. ### Alignment with HTTP API -Every command usable from the CLI is also available through the [HTTP API](/reference/http/api). For example: +Every command usable from the CLI is also available through the [HTTP API](http/api.md). For example: ```sh > ipfs swarm peers diff --git a/docs/reference/http/api.md b/docs/reference/http/api.md index 9925e1559..743fca1fd 100644 --- a/docs/reference/http/api.md +++ b/docs/reference/http/api.md @@ -25,7 +25,7 @@ This document was autogenerated from go-ipfs. For issues and support, check out The HTTP API under `/api/v0/` is an RPC-style API over HTTP, not a REST API. -[Every command](/reference/cli/) usable from the CLI is also available through the HTTP API. For example: +[Every command](../cli.md) usable from the CLI is also available through the HTTP API. For example: ```sh > ipfs swarm peers diff --git a/docs/reference/js/api.md b/docs/reference/js/api.md index 489b3db22..bb3f966b9 100644 --- a/docs/reference/js/api.md +++ b/docs/reference/js/api.md @@ -16,7 +16,7 @@ There are two main JavaScript libraries for working with IPFS. Both work in Node - [JS-IPFS](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs) is a full implementation of IPFS, similar to [Go-IPFS](https://github.com/ipfs/go-ipfs). You can use it either as a command-line application or as a library to start an IPFS node directly in your program. -- The [JS-IPFS HTTP client](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) is a smaller library that controls an IPFS node that is already running via its [HTTP API](/reference/http/api/). JS-IPFS actually uses this library internally if it detects that another node is already running on your computer. You can also interact with the [HTTP API](/reference/http/api/) directly using `fetch()` in a browser or a module like `request` in Node.js, but using this library can be much more convenient. +- The [JS-IPFS HTTP client](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-http-client) is a smaller library that controls an IPFS node that is already running via its [HTTP API](../http/api.md). JS-IPFS actually uses this library internally if it detects that another node is already running on your computer. You can also interact with the [HTTP API](../http/api.md) directly using `fetch()` in a browser or a module like `request` in Node.js, but using this library can be much more convenient. Both libraries have the same [interface for using all the major IPFS commands](https://github.com/ipfs/js-ipfs/tree/master/docs/core-api). diff --git a/docs/welcome-builders.md b/docs/welcome-builders.md index 575075002..a78dcbda1 100644 --- a/docs/welcome-builders.md +++ b/docs/welcome-builders.md @@ -16,13 +16,13 @@ description: The home page for developer documentation for IPFS, the InterPlanet **IPFS is a content-addressed system for storing and delivering data over a globally distributed network of peers.** As a critical ingredient in a wide variety of decentralized applications and services powering the future of the internet, IPFS is an important complement to blockchains, decentralized identity, verifiable storage like [Filecoin](https://filecoin.io), and other ingredients in a distributed web (d-web) stack. -[Learn more →](/concepts/what-is-ipfs/#what-is-ipfs) +[Learn more →](concepts/what-is-ipfs.md#what-is-ipfs) ## Who's building on IPFS **Individuals and organizations worldwide are using IPFS to build successful apps and services for a truly amazing variety of use cases and industries.** Whether you're interested in NFTs or networked communities, streaming music or social media, IPFS can play a critical part in your decentralized tech stack. Check out these resources: -- [**Case Study Series**](/concepts/#examples-and-case-studies) — Success stories in industries ranging from big data to e-commerce and more. +- [**Case Study Series**](concepts/README.md#examples-and-case-studies) — Success stories in industries ranging from big data to e-commerce and more. - [**IPFS Ecosystem Explorer**](https://ipfs.io/images/ipfs-applications-diagram.png) — See the full landscape of companies shipping apps, services, and more built on IPFS. - [**Awesome IPFS**](https://awesome.ipfs.io) — Community projects of all shapes and sizes, from production apps to open-source data sets to experimental repos. @@ -32,20 +32,20 @@ Or, check out the [Building Web3 video series](https://www.youtube.com/playlist? ## IPFS and you -**What can _you_ build using IPFS?** Thanks to a rapidly growing developer community, global traction for a wide variety of use cases, and active open-source development, the possibilities are virtually endless. Check out these [usage ideas and examples](concepts/usage-ideas-examples/) for inspiration, plus these pointers for getting started integrating IPFS into your project: +**What can _you_ build using IPFS?** Thanks to a rapidly growing developer community, global traction for a wide variety of use cases, and active open-source development, the possibilities are virtually endless. Check out these [usage ideas and examples](concepts/usage-ideas-examples.md) for inspiration, plus these pointers for getting started integrating IPFS into your project: - With implementations in [Go](https://github.com/ipfs/go-ipfs) and [JavaScript](https://js.ipfs.io/) (plus [Rust](https://github.com/rs-ipfs/rust-ipfs) in the works), options for **directly integrating IPFS into your codebase** are versatile. -- For **IPFS-based deployment and dev tools**, the options are growing every day — including [Fleek](https://fleek.co) (deployment, storage, and app tooling), [Textile](https://tetile.io) (databases, storage, CDN, Filecoin integration), and [Fission](https://fission.codes) (front-end app publishing using web3 back-end tools), to name just a few. +- For **IPFS-based deployment and dev tools**, the options are growing every day — including [Fleek](https://fleek.co) (deployment, storage, and app tooling), [Textile](https://textile.io) (databases, storage, CDN, Filecoin integration), and [Fission](https://fission.codes) (front-end app publishing using web3 back-end tools), to name just a few. - Want to integrate **Filecoin** into your architecture in addition to IPFS? [Learn how Filecoin and IPFS work together](https://docs.filecoin.io/about-filecoin/ipfs-and-filecoin/). - For hosting large amounts of data on multiple nodes, [IPFS Cluster](https://cluster.ipfs.io) helps you with **data orchestration across many peers**. -- Or, to **ensure availability** without having to maintain your own IPFS infrastructure, you can use a [third-party pinning service](/concepts/persistence/#pinning-services) to host your files on their own nodes. +- Or, to **ensure availability** without having to maintain your own IPFS infrastructure, you can use a [third-party pinning service](concepts/persistence.md#pinning-services) to host your files on their own nodes. ## Get started right now Ready to roll up your sleeves and dive in? Start with these resources: -- Just want to get hacking right away? [Install IPFS](/install/command-line/) through the command line and start exploring. -- Check out the [**API and CLI reference guides**](/reference/) to learn more about hands-on use, or dig into the [**how-tos and tutorials**](/how-to/) here in the docs. +- Just want to get hacking right away? [Install IPFS](install/command-line.md) through the command line and start exploring. +- Check out the [**API and CLI reference guides**](reference/README.md) to learn more about hands-on use, or dig into the [**how-tos and tutorials**](how-to/README.md) here in the docs. - Ask questions or start a discussion in the [**official IPFS forums**](https://discuss.ipfs.io). - Find virtual and in-person [**hackathons and other events**](https://blog.ipfs.io/?category=Event) on the [IPFS Blog & News](https://blog.ipfs.io) page. -- Learn the [**basics of IPFS concepts**](/concepts/) like content addressing and peer-to-peer sharing here in the docs, or try hands-on examples over at [ProtoSchool](https://proto.school). +- Learn the [**basics of IPFS concepts**](concepts/README.md) like content addressing and peer-to-peer sharing here in the docs, or try hands-on examples over at [ProtoSchool](https://proto.school).