diff --git a/src/app/docs/layers/documents/page.mdx b/src/app/docs/layers/documents/page.mdx
index 9ac558b5..c3d3b287 100644
--- a/src/app/docs/layers/documents/page.mdx
+++ b/src/app/docs/layers/documents/page.mdx
@@ -14,7 +14,7 @@ Authors create and join documents: mutable key-value stores that multiple users
/>
-## Documents
+## Document Namespaces
A document is a _namespace_ that is uniquely identified by a keypair.
@@ -49,14 +49,24 @@ ktrygcpxealfdtfmohw66nb2keivu52opk65cyj4j7jy7wior7ea
Document IDs are base32-lower serialization of the public key of the document. They do _not_ change as the document changes.
-{/*
-## Permissions
+## Syncronizing Documents
-## Multiple Writers
+When an author wants to sync with a document, they first find the document's current state, then they perform a [range-based set reconciliation](https://arxiv.org/abs/2212.13567) to fill in any changes in the keyspace.
-## Collaging
+When two nodes want to sync, they perform a range-based set reconciliation to fill in any changes in the keyspace. Any node with the read key (document ID) can read & sync the latest state of the document. Having the read key denotes read access. All entries in the document are double-signed, once with an authorID (keypair) and the write key of the document.
-## Subscriptions
+
+Check out our [youtube video](https://www.youtube.com/watch?v=_D_tbAMqADM) on how range-based set reconciliation works!
+
-## Revocations & Key Rotations
-*/}
+After this synchronization step, we know the hashes of all the content the document references. By default iroh documents will fetch all content associated with the document.
+
+## Document PubSub
+
+Every document is it's own pubsub swarm, keyed by the public key of the document. Iroh pubsub swarms implement techniques described in [HyParView](https://asc.di.fct.unl.pt/~jleitao/pdf/dsn07-leitao.pdf?ref=bartoszsypytkowski.com) & PlumTree to keep a bounded number of active nodes any one node in the swarm needs to push to.
+
+
+Bartosz Sypytkowski has a great [blog post](https://www.bartoszsypytkowski.com/hyparview/) on HyParView & Plumtree, well worth reading.
+
+
+As authors write to a document, they publish these changes as pubsub messages that other peers pick up on & apply to their local state.
diff --git a/src/components/BlogPostLayout.jsx b/src/components/BlogPostLayout.jsx
index e514895a..437c895d 100644
--- a/src/components/BlogPostLayout.jsx
+++ b/src/components/BlogPostLayout.jsx
@@ -47,13 +47,12 @@ export function BlogPostLayout({ article, references = [], children }) {
{article.title}
-
- by {article.author}
+
+
+ {' '}by {article.author}
+
{children}
diff --git a/src/components/GithubStars.jsx b/src/components/GithubStars.jsx
index 415f1cf0..e04add46 100644
--- a/src/components/GithubStars.jsx
+++ b/src/components/GithubStars.jsx
@@ -6,7 +6,7 @@ export default function GithubStars(props) {
return (
- 1.4k
+ 1.5k
)
}
\ No newline at end of file
diff --git a/src/components/Header.jsx b/src/components/Header.jsx
index dc3feca3..d12c7d94 100644
--- a/src/components/Header.jsx
+++ b/src/components/Header.jsx
@@ -17,6 +17,7 @@ import {ThemeToggle} from '@/components/ThemeToggle';
import GithubStars from './GithubStars';
export const navItems = [
+ {content: 'Blog', href: '/blog'},
{content: 'Docs', href: '/docs'},
{content: 'YouTube', href: 'https://www.youtube.com/@n0computer'},
];
@@ -26,7 +27,7 @@ export function TopLevelNavItem({href, children}) {