From e2db7cd7a40e7235f496f6a0e88d789489f69592 Mon Sep 17 00:00:00 2001 From: Jacob Karlsson Date: Thu, 13 Jun 2024 11:58:26 +0200 Subject: [PATCH] Deploy website - based on 97b440cf32c9eb350b0d9ce7e5b22accebff7e77 --- 404.html | 4 ++-- assets/js/c4f5d8e4.03510489.js | 1 - assets/js/c4f5d8e4.46d4d081.js | 1 + .../{runtime~main.da554033.js => runtime~main.bd244c3a.js} | 2 +- guide/category/concepts/index.html | 4 ++-- guide/category/philosophy/index.html | 4 ++-- guide/concepts/feed/index.html | 4 ++-- guide/concepts/glossary/index.html | 4 ++-- guide/concepts/hub/index.html | 4 ++-- guide/concepts/invite/index.html | 4 ++-- guide/concepts/message/index.html | 4 ++-- guide/concepts/overview/index.html | 4 ++-- guide/concepts/peer/index.html | 4 ++-- guide/concepts/replication/index.html | 4 ++-- guide/intro/index.html | 4 ++-- guide/philosophy/app-friendly/index.html | 4 ++-- guide/philosophy/regenerative/index.html | 4 ++-- guide/philosophy/sufficiency/index.html | 4 ++-- guide/philosophy/villages/index.html | 4 ++-- index.html | 6 +++--- markdown-page/index.html | 4 ++-- 21 files changed, 39 insertions(+), 39 deletions(-) delete mode 100644 assets/js/c4f5d8e4.03510489.js create mode 100644 assets/js/c4f5d8e4.46d4d081.js rename assets/js/{runtime~main.da554033.js => runtime~main.bd244c3a.js} (57%) diff --git a/404.html b/404.html index d0191ba..2b5849e 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | PZP - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/assets/js/c4f5d8e4.03510489.js b/assets/js/c4f5d8e4.03510489.js deleted file mode 100644 index 0caab54..0000000 --- a/assets/js/c4f5d8e4.03510489.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpzp_wiki=self.webpackChunkpzp_wiki||[]).push([[634],{778:(e,t,a)=>{a.r(t),a.d(t,{default:()=>f});var n=a(7953),r=a(8835),l=a(962),o=a(1746),s=a(464),i=a(5265);const c={features:"features_t9lD",featureSvg:"featureSvg_GfXr"},m=[{title:"Code",description:n.createElement(n.Fragment,null,"PZP is not ready for end users yet but it's stable enough for developers to have a fun time hacking with/on it."),link:"https://codeberg.org/pzp"},{title:"SDK",description:n.createElement(n.Fragment,null,"We have a simple SDK that helps you get started making PZP apps."),link:"https://codeberg.org/pzp/pzp-sdk"},{title:"Demo app",description:n.createElement(n.Fragment,null,"A demo app demonstrating some PZP features. Take a look at the code for inspiration. Note that you probably have to be a developer to build and use it."),link:"https://codeberg.org/pzp/zooboard"}];function p(e){let{title:t,description:a,link:l}=e;return n.createElement("div",{className:(0,r.A)("col col--4")},n.createElement("div",{className:"text--center padding-horiz--md"},n.createElement("a",{href:l,target:"_blank",style:{color:"var(--ifm-font-color-base)"}},n.createElement("h3",null,t),n.createElement("p",null,a))))}function u(){return n.createElement("section",{className:c.features},n.createElement("div",{className:"container"},n.createElement("div",{className:"row"},m.map(((e,t)=>n.createElement(p,(0,i.A)({key:t},e)))))))}const d={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function h(){const{siteConfig:e}=(0,o.A)();return n.createElement("header",{className:(0,r.A)("hero hero--primary",d.heroBanner)},n.createElement("div",{className:"container"},n.createElement("h1",{className:"hero__title"},e.title),n.createElement("p",{className:"hero__subtitle"},e.tagline),n.createElement("div",{className:d.buttons},n.createElement(l.A,{className:"button button--secondary button--lg",to:"/guide/intro"},"Read the protocol docs"))))}function f(){const{siteConfig:e}=(0,o.A)();return n.createElement(s.A,{title:`${e.title}`,description:"A rad p2p protocol"},n.createElement(h,null),n.createElement("main",null,n.createElement(u,null)))}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.46d4d081.js b/assets/js/c4f5d8e4.46d4d081.js new file mode 100644 index 0000000..d74de3e --- /dev/null +++ b/assets/js/c4f5d8e4.46d4d081.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpzp_wiki=self.webpackChunkpzp_wiki||[]).push([[634],{778:(e,t,a)=>{a.r(t),a.d(t,{default:()=>g});var n=a(7953),r=a(8835),l=a(962),o=a(1746),s=a(464),c=a(5265),i=a(664);const m={features:"features_t9lD",featureSvg:"featureSvg_GfXr"},p=[{title:"Code",description:n.createElement(n.Fragment,null,"PZP is not ready for end users yet but it's stable enough for developers to have a fun time hacking with/on it."),link:"https://codeberg.org/pzp"},{title:"SDK",description:n.createElement(n.Fragment,null,"We have a simple SDK that helps you get started making PZP apps."),link:"https://codeberg.org/pzp/pzp-sdk"},{title:"Demo app",description:n.createElement(n.Fragment,null,"A demo app demonstrating some PZP features. Take a look at the code for inspiration. Note that you probably have to be a developer to build and use it."),link:"https://codeberg.org/pzp/zooboard"}];function u(e){let{title:t,description:a,link:l}=e;return n.createElement("div",{className:(0,r.A)("col col--4")},n.createElement("div",{className:"text--center padding-horiz--md"},n.createElement("a",{href:l,target:"_blank",style:{color:"var(--ifm-font-color-base)"}},n.createElement("h3",null,t,n.createElement(i.A,null)),n.createElement("p",null,a))))}function d(){return n.createElement("section",{className:m.features},n.createElement("div",{className:"container"},n.createElement("div",{className:"row"},p.map(((e,t)=>n.createElement(u,(0,c.A)({key:t},e)))))))}const h={heroBanner:"heroBanner_qdFl",buttons:"buttons_AeoN"};function f(){const{siteConfig:e}=(0,o.A)();return n.createElement("header",{className:(0,r.A)("hero hero--primary",h.heroBanner)},n.createElement("div",{className:"container"},n.createElement("h1",{className:"hero__title"},e.title),n.createElement("p",{className:"hero__subtitle"},e.tagline),n.createElement("div",{className:h.buttons},n.createElement(l.A,{className:"button button--secondary button--lg",to:"/guide/intro"},"Read the protocol docs"))))}function g(){const{siteConfig:e}=(0,o.A)();return n.createElement(s.A,{title:`${e.title}`,description:"A rad p2p protocol"},n.createElement(f,null),n.createElement("main",null,n.createElement(d,null)))}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.da554033.js b/assets/js/runtime~main.bd244c3a.js similarity index 57% rename from assets/js/runtime~main.da554033.js rename to assets/js/runtime~main.bd244c3a.js index f520e6e..6f9fdd1 100644 --- a/assets/js/runtime~main.da554033.js +++ b/assets/js/runtime~main.bd244c3a.js @@ -1 +1 @@ -(()=>{"use strict";var e,t,r,a,o,c={},n={};function d(e){var t=n[e];if(void 0!==t)return t.exports;var r=n[e]={id:e,loaded:!1,exports:{}};return c[e].call(r.exports,r,r.exports,d),r.loaded=!0,r.exports}d.m=c,d.c=n,e=[],d.O=(t,r,a,o)=>{if(!r){var c=1/0;for(i=0;i=o)&&Object.keys(d.O).every((e=>d.O[e](r[f])))?r.splice(f--,1):(n=!1,o0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[r,a,o]},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);d.r(o);var c={};t=t||[null,r({}),r([]),r(r)];for(var n=2&a&&e;"object"==typeof n&&!~t.indexOf(n);n=r(n))Object.getOwnPropertyNames(n).forEach((t=>c[t]=()=>e[t]));return c.default=()=>e,d.d(o,c),o},d.d=(e,t)=>{for(var r in t)d.o(t,r)&&!d.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce(((t,r)=>(d.f[r](e,t),t)),[])),d.u=e=>"assets/js/"+({3:"ed9eb515",28:"d4eaec92",61:"1f391b9e",73:"75e286b7",134:"393be207",168:"a38a1c51",182:"1311eaab",204:"b922ccdb",307:"75634d12",312:"bf3de0eb",390:"3cd99823",401:"17896441",541:"840787a5",579:"56cb3656",581:"935f2afb",598:"0cdaa55b",608:"54d808ca",634:"c4f5d8e4",714:"1be78505",754:"9494e518",811:"a8b86472",855:"e78c887f",942:"20e7ad22",969:"14eb3368"}[e]||e)+"."+{3:"a0f1d132",28:"1846ff53",61:"7ffd3b83",73:"0785b095",106:"a754d01b",134:"9d88a287",168:"d83efab0",182:"25757973",204:"2705b496",307:"8c504c3c",312:"b7a8c0ba",390:"9596864a",401:"6d2df60a",541:"d3d429a2",553:"41a02302",579:"47862af4",581:"c46bc9b4",598:"7886802b",608:"3b5fef2c",634:"03510489",708:"c66da8e3",714:"ce1d2d02",715:"b86d8860",754:"59faeb80",811:"803dad25",846:"a9907e1c",855:"1c08f8c9",942:"a948da10",969:"9de4255d"}[e]+".js",d.miniCssF=e=>{},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="pzp-wiki:",d.l=(e,t,r,c)=>{if(a[e])a[e].push(t);else{var n,f;if(void 0!==r)for(var b=document.getElementsByTagName("script"),i=0;i{n.onerror=n.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],n.parentNode&&n.parentNode.removeChild(n),o&&o.forEach((e=>e(r))),t)return t(r)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:n}),12e4);n.onerror=l.bind(null,n.onerror),n.onload=l.bind(null,n.onload),f&&document.head.appendChild(n)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.p="/",d.gca=function(e){return e={17896441:"401",ed9eb515:"3",d4eaec92:"28","1f391b9e":"61","75e286b7":"73","393be207":"134",a38a1c51:"168","1311eaab":"182",b922ccdb:"204","75634d12":"307",bf3de0eb:"312","3cd99823":"390","840787a5":"541","56cb3656":"579","935f2afb":"581","0cdaa55b":"598","54d808ca":"608",c4f5d8e4:"634","1be78505":"714","9494e518":"754",a8b86472:"811",e78c887f:"855","20e7ad22":"942","14eb3368":"969"}[e]||e,d.p+d.u(e)},(()=>{var e={354:0,869:0};d.f.j=(t,r)=>{var a=d.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(354|869)$/.test(t))e[t]=0;else{var o=new Promise(((r,o)=>a=e[t]=[r,o]));r.push(a[2]=o);var c=d.p+d.u(t),n=new Error;d.l(c,(r=>{if(d.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),c=r&&r.target&&r.target.src;n.message="Loading chunk "+t+" failed.\n("+o+": "+c+")",n.name="ChunkLoadError",n.type=o,n.request=c,a[1](n)}}),"chunk-"+t,t)}},d.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,c=r[0],n=r[1],f=r[2],b=0;if(c.some((t=>0!==e[t]))){for(a in n)d.o(n,a)&&(d.m[a]=n[a]);if(f)var i=f(d)}for(t&&t(r);b{"use strict";var e,t,r,a,o,n={},c={};function d(e){var t=c[e];if(void 0!==t)return t.exports;var r=c[e]={id:e,loaded:!1,exports:{}};return n[e].call(r.exports,r,r.exports,d),r.loaded=!0,r.exports}d.m=n,d.c=c,e=[],d.O=(t,r,a,o)=>{if(!r){var n=1/0;for(i=0;i=o)&&Object.keys(d.O).every((e=>d.O[e](r[f])))?r.splice(f--,1):(c=!1,o0&&e[i-1][2]>o;i--)e[i]=e[i-1];e[i]=[r,a,o]},d.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return d.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);d.r(o);var n={};t=t||[null,r({}),r([]),r(r)];for(var c=2&a&&e;"object"==typeof c&&!~t.indexOf(c);c=r(c))Object.getOwnPropertyNames(c).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,d.d(o,n),o},d.d=(e,t)=>{for(var r in t)d.o(t,r)&&!d.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce(((t,r)=>(d.f[r](e,t),t)),[])),d.u=e=>"assets/js/"+({3:"ed9eb515",28:"d4eaec92",61:"1f391b9e",73:"75e286b7",134:"393be207",168:"a38a1c51",182:"1311eaab",204:"b922ccdb",307:"75634d12",312:"bf3de0eb",390:"3cd99823",401:"17896441",541:"840787a5",579:"56cb3656",581:"935f2afb",598:"0cdaa55b",608:"54d808ca",634:"c4f5d8e4",714:"1be78505",754:"9494e518",811:"a8b86472",855:"e78c887f",942:"20e7ad22",969:"14eb3368"}[e]||e)+"."+{3:"a0f1d132",28:"1846ff53",61:"7ffd3b83",73:"0785b095",106:"a754d01b",134:"9d88a287",168:"d83efab0",182:"25757973",204:"2705b496",307:"8c504c3c",312:"b7a8c0ba",390:"9596864a",401:"6d2df60a",541:"d3d429a2",553:"41a02302",579:"47862af4",581:"c46bc9b4",598:"7886802b",608:"3b5fef2c",634:"46d4d081",708:"c66da8e3",714:"ce1d2d02",715:"b86d8860",754:"59faeb80",811:"803dad25",846:"a9907e1c",855:"1c08f8c9",942:"a948da10",969:"9de4255d"}[e]+".js",d.miniCssF=e=>{},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="pzp-wiki:",d.l=(e,t,r,n)=>{if(a[e])a[e].push(t);else{var c,f;if(void 0!==r)for(var b=document.getElementsByTagName("script"),i=0;i{c.onerror=c.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],c.parentNode&&c.parentNode.removeChild(c),o&&o.forEach((e=>e(r))),t)return t(r)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=l.bind(null,c.onerror),c.onload=l.bind(null,c.onload),f&&document.head.appendChild(c)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.p="/",d.gca=function(e){return e={17896441:"401",ed9eb515:"3",d4eaec92:"28","1f391b9e":"61","75e286b7":"73","393be207":"134",a38a1c51:"168","1311eaab":"182",b922ccdb:"204","75634d12":"307",bf3de0eb:"312","3cd99823":"390","840787a5":"541","56cb3656":"579","935f2afb":"581","0cdaa55b":"598","54d808ca":"608",c4f5d8e4:"634","1be78505":"714","9494e518":"754",a8b86472:"811",e78c887f:"855","20e7ad22":"942","14eb3368":"969"}[e]||e,d.p+d.u(e)},(()=>{var e={354:0,869:0};d.f.j=(t,r)=>{var a=d.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(354|869)$/.test(t))e[t]=0;else{var o=new Promise(((r,o)=>a=e[t]=[r,o]));r.push(a[2]=o);var n=d.p+d.u(t),c=new Error;d.l(n,(r=>{if(d.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;c.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",c.name="ChunkLoadError",c.type=o,c.request=n,a[1](c)}}),"chunk-"+t,t)}},d.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,n=r[0],c=r[1],f=r[2],b=0;if(n.some((t=>0!==e[t]))){for(a in c)d.o(c,a)&&(d.m[a]=c[a]);if(f)var i=f(d)}for(t&&t(r);b Concepts | PZP - + - + \ No newline at end of file diff --git a/guide/category/philosophy/index.html b/guide/category/philosophy/index.html index e539f66..63fb1dd 100644 --- a/guide/category/philosophy/index.html +++ b/guide/category/philosophy/index.html @@ -4,13 +4,13 @@ Philosophy | PZP - + - + \ No newline at end of file diff --git a/guide/concepts/feed/index.html b/guide/concepts/feed/index.html index 4151d86..e09d440 100644 --- a/guide/concepts/feed/index.html +++ b/guide/concepts/feed/index.html @@ -4,13 +4,13 @@ Feed | PZP - +

Feed

Definition

A feed is an evolving set of interlinked messages intended for continuous replication in a gossip network.

In computer science terms, it's an Directed Acyclic Graph (DAG) with only one source node, where all the "nodes" are messages, and "edges" are references that each message contains of other messages.

The root is...

The tangle is identified by the hash of its root message.

Account

An account is a special type of tangle, where the messages describe which keypairs are part of the same "account".

Msgs in an account tangle are special because they have empty account and accountTips fields.

interface Msg {
data: AccountData
metadata: {
dataHash: ContentHash
dataSize: number
account: 'self' // MUST be the string 'self'
accountTips: null // MUST be null
tangles: {
[accountTangleId: string]: {
depth: number // maximum distance (positive integer) from this msg to the root
prev: Array<MsgHash> // list of msg hashes of existing msgs, unique set and ordered alphabetically
}
}
domain: string // alphanumeric string, at least 3 chars, max 100 chars
v: 3
}
pubkey: Pubkey
sig: Signature
}

type AccountData =
| { action: 'add', add: AccountAdd }
| { action: 'del', del: AccountDel }

// "add" means this keypair can validly add more keypairs to the account tangle
// "del" means this keypair can validly revoke other keypairs from the account
// "box" means the peer with this keypair should get access to the box keypair
type AccountPower = 'add' | 'del' | 'box'

type AccountAdd = {
key: Key
nonce?: string // nonce required only on the account tangle's root
consent?: string // base58 encoded signature of the string `:account-add:<ID>` where `<ID>` is the account's ID, required only on non-root msgs
accountPowers?: Array<AccountPower> // list of powers granted to this key, defaults to []
}

type AccountDel = {
key: Key
}

type Key =
| {
purpose: 'sig' // digital signatures
algorithm: 'ed25519' // libsodium crypto_sign_detached
bytes: string // base58 encoded string for the public key being added
}
| {
// WIP!!
purpose: 'box' // asymmetric encryption
algorithm: 'x25519-xsalsa20-poly1305' // libsodium crypto_box_easy
bytes: string // base58 encoded string of the public key
}

Examples of accountData:

  • Registering the first signing pubkey:
    {
    "action": "add",
    "add": {
    "key": {
    "purpose": "sig",
    "algorithm": "ed25519",
    "bytes": "3JrJiHEQzRFMzEqWawfBgq2DSZDyihP1NHXshqcL8pB9"
    },
    "nonce": "6GHR1ZFFSB3C5qAGwmSwVH8f7byNo8Cqwn5PcyG3qDvS"
    }
    }
  • Registering a subaccount:
    {
    "action": "add",
    "add": {
    "key": {
    "purpose": "subaccount",
    "algorithm": "tangle",
    "bytes": "6yqq7iwyJEKdofJ3xpRLEq"
    }
    }
    }
  • Revoking a signing pubkey:
    {
    "action": "del",
    "del": {
    "key": {
    "purpose": "sig",
    "algorithm": "ed25519",
    "bytes": "3JrJiHEQzRFMzEqWawfBgq2DSZDyihP1NHXshqcL8pB9"
    }
    }
    }

Moot feeds

A feed is a special type of tangle, where the root is a predictable (by any peer) message with no content.

Root:

interface Msg {
data: null // MUST be null
metadata: {
dataHash: null // MUST be null
dataSize: 0 // MUST be 0
account: string // MUST be an ID
accountTips: null // MUST be null
tangles: {} // MUST be empty object
domain: string
v: 2
}
pubkey: Pubkey
sig: Signature
}
- + \ No newline at end of file diff --git a/guide/concepts/glossary/index.html b/guide/concepts/glossary/index.html index 5a4b035..ab11ff0 100644 --- a/guide/concepts/glossary/index.html +++ b/guide/concepts/glossary/index.html @@ -4,13 +4,13 @@ Glossary | PZP - +

Glossary

  • Msg = published data that is signed and shareable
  • Msg hash = hash(msg.metadata)
  • Tangle = any single-root DAG of msgs that can be replicated by peers
  • Tangle Root = the origin msg of a tangle
  • Tangle Affix = any msg in a tangle that is not the root
  • Tangle Tips = tangle msgs that are not yet referenced by any other msg in the tangle
  • Tangle ID = Msg hash of the tangle's root msg
  • Account tangle = tangle with msgs that add (or remove?) asymmetric-crypto public keys
  • Account ID = tangle ID of the account tangle, refers to a person or a group
  • Moot = the "virtual root" of a tangle. The moot is a msg that is deterministically predictable and empty, so to allow others to pre-know its hash. It never needs to be stored in disk nor transmitted via network, since it can be recreated on the fly
  • Feed = tangle with msgs authored by (any pubkey in) an account under a certain "domain", beginning from a moot
  • Feed ID = ID of a feed (Msg ID of the feed's moot)
- + \ No newline at end of file diff --git a/guide/concepts/hub/index.html b/guide/concepts/hub/index.html index 589d51a..8ccf2aa 100644 --- a/guide/concepts/hub/index.html +++ b/guide/concepts/hub/index.html @@ -4,13 +4,13 @@ Hub | PZP - +

Hub

Definition

A hub is a server that allow clients to communicate with each other via end-to-end encrypted tunnels. Hubs and clients form a fluid multi-star topology.

- + \ No newline at end of file diff --git a/guide/concepts/invite/index.html b/guide/concepts/invite/index.html index 1978549..edb040f 100644 --- a/guide/concepts/invite/index.html +++ b/guide/concepts/invite/index.html @@ -4,13 +4,13 @@ Invite | PZP - +
- + \ No newline at end of file diff --git a/guide/concepts/message/index.html b/guide/concepts/message/index.html index 924ead9..70693ad 100644 --- a/guide/concepts/message/index.html +++ b/guide/concepts/message/index.html @@ -4,13 +4,13 @@ Message | PZP - +

Message

Definition

A message is a JSON encoded data structure that is signed by a peer and intended for replication in a gossip network.

Data

Metadata

Public key

Signature

- + \ No newline at end of file diff --git a/guide/concepts/overview/index.html b/guide/concepts/overview/index.html index 5220067..5223479 100644 --- a/guide/concepts/overview/index.html +++ b/guide/concepts/overview/index.html @@ -4,13 +4,13 @@ Overview | PZP - +
- + \ No newline at end of file diff --git a/guide/concepts/peer/index.html b/guide/concepts/peer/index.html index ccfb200..62edde3 100644 --- a/guide/concepts/peer/index.html +++ b/guide/concepts/peer/index.html @@ -4,13 +4,13 @@ Peer | PZP - +

Peer

Definition

A peer is a participant in a gossip network, identified by a self-certifying cryptographic keypair.

Keypair for SHSe

Asymmetric cryptographic keypair that identifies the current peer.

- + \ No newline at end of file diff --git a/guide/concepts/replication/index.html b/guide/concepts/replication/index.html index e5ea19b..1b51a6c 100644 --- a/guide/concepts/replication/index.html +++ b/guide/concepts/replication/index.html @@ -4,13 +4,13 @@ Replication | PZP - +
- + \ No newline at end of file diff --git a/guide/intro/index.html b/guide/intro/index.html index 7f27666..3a1bb55 100644 --- a/guide/intro/index.html +++ b/guide/intro/index.html @@ -4,13 +4,13 @@ PZP Docs | PZP - +

PZP Docs

What is "PZP":

  • A local-first P2P protocol with 10 years of learnings baked in
  • Message formats + Message validation + RPC methods
  • If scuttlebutt is 🙂 then pzp is 😎
  • No apps so far except for a demo app, but it's ready for developers to have fun with and hack on.

Features

  • Peer to peer. PZP is designed in a way to avoid centralization of power.
  • Low storage expectations. Expecting users to store large amounts of data makes adoption on phones and old devices hard, and eventually risks centralization and corporate takeover when only resource rich users or even companies have enough resources needed to keep the network running.
  • Content/public-key adressed data. We try to avoid relying on DNS since that would put too much trust/pressure on single nodes.
  • Easy to use CRDT data structures like sets and dicts.
  • Local-first
  • No DHTs or other singletons.
  • First class multi-device and multi-app support. A user's account ID is independent of what keypair(s) they choose to use, so keypairs can be added and rotated.
  • Partial replication using tangles (merkle-trees) and lipmaa links.
  • Message deletion (can leave nothing, or only metadata).
  • Trust based (friend to friend) with a simple invite system.

How PZP is different from SSB (Secure Scuttlebutt)

  • Storage is designed to not grow indefinitely. By default (of course overridable) an app's storage shouldn't go above 100MB.
  • Multi device/app support from the start. Every device/app has its own keypair. They're connected together into one identity using an Account tangle. The Account tangle's root message ID is the account's identifier.
  • One account or even keypair can post messages concurrently (forking) without problem. Because there aren't linear feeds, everything is in tangles, including state updates like e.g. username changes.
  • Deletion is possible. The data contents of a message is separate from the message metadata, and only the metadata + hash of the data is signed.
  • When messages are getting signed they get serialized according to RFC 8785.
  • Easy to use invites

How PZP is different from Nostr

  • keys are not shared across devices
  • sig-chains - you know if you're missing content in PZP
  • trust based - invite only

Tangles

Tangles control how messages are organised. They provide a way to group, and causally sort (partially), which is important for replication.

Basics of tangles in PZP: it's a directed acyclic graph (DAG) which aims to be as linear as possible

There are 3 sorts of tangles:

  • Account - a tangle which weaves (device) keys and defines capabilities / permissions of these
  • Feed - a tangle where all messages are from valid devices (as defined by an Account), and scoped to a particular domain
    • e.g. all post messages from "mix"
    • e.g. all chess messages from "happy0"
  • Thread - a tangle where multiple Accounts are collaborating on some state
    • e.g. all the messages making up a "10th birthday gathering"
    • e.g. all the messages in a discussion
    • e.g. all the messages in a shared shopping list

All tangles have

  • a root / root message
  • an ID (the id of the root message of the tangle)
  • have tangle-data for causal ordering

How the tangles differ

  • the Account tangle has strict validation of messages (it is only valid to write to it if you've been given permission to)
  • a Feed root is deterministic! (only inputs are accountId + domain)

Account Tangle

The account tangle starts with a message which says "This key is allowed to author messages on behalf of this account, and add further keys".

Subsequent messages in this tangle may add / remove capabilities for existing / new keys.

Messages in this tangle are verified by checking state they're extending on

Feed Tangle

Domain Tangle, AccountDomain Tangle

Thread Tangle

TODO

Specifications

Messages

Replication

Invites

Sets

Dicts

Further exploration

Code

PZP is not ready for end users yet but it's stable enough for developers to have a fun time hacking with/on it. All the code is available on codeberg

SDK

We have a simple SDK that helps you get started making PZP apps.

Demo app

A demo app demonstrating some PZP features. Take a look at the code for inspiration. Note that you probably have to be a developer to build and use it.

- + \ No newline at end of file diff --git a/guide/philosophy/app-friendly/index.html b/guide/philosophy/app-friendly/index.html index 1a4400e..4cfc4b8 100644 --- a/guide/philosophy/app-friendly/index.html +++ b/guide/philosophy/app-friendly/index.html @@ -4,13 +4,13 @@ App-friendly | PZP - +
- + \ No newline at end of file diff --git a/guide/philosophy/regenerative/index.html b/guide/philosophy/regenerative/index.html index 12aa539..134031f 100644 --- a/guide/philosophy/regenerative/index.html +++ b/guide/philosophy/regenerative/index.html @@ -4,13 +4,13 @@ Regenerative | PZP - +
- + \ No newline at end of file diff --git a/guide/philosophy/sufficiency/index.html b/guide/philosophy/sufficiency/index.html index 2386afa..15637a8 100644 --- a/guide/philosophy/sufficiency/index.html +++ b/guide/philosophy/sufficiency/index.html @@ -4,13 +4,13 @@ Sufficiency | PZP - +

Sufficiency

Aim at "good enough" on all relevant criteria, instead of "best" on any one.

- + \ No newline at end of file diff --git a/guide/philosophy/villages/index.html b/guide/philosophy/villages/index.html index 61e3051..d69543b 100644 --- a/guide/philosophy/villages/index.html +++ b/guide/philosophy/villages/index.html @@ -4,13 +4,13 @@ Villages | PZP - +

Villages

We are not trying to fix social media, we are trying to make it less central in our lives. As a replacement, we want to increase the role of villages, networks of friends, and small communities in society.

Small (dozens)Medium (hundreds)Large (thousands+)
PZP
TelegramDiscourseTwitter / X
SignalMastodonMastodon
WhatsAppDiscordFacebook
MessengerSlackInstagram
BriarMatrixThreads
SSBSSB
Bluesky
Nostr
- + \ No newline at end of file diff --git a/index.html b/index.html index 87c5744..1f68ca6 100644 --- a/index.html +++ b/index.html @@ -4,13 +4,13 @@ PZP | PZP - + - +
+ \ No newline at end of file diff --git a/markdown-page/index.html b/markdown-page/index.html index ded00b0..00e48ac 100644 --- a/markdown-page/index.html +++ b/markdown-page/index.html @@ -4,13 +4,13 @@ Markdown page example | PZP - +

Markdown page example

You don't need React to write simple standalone pages.

- + \ No newline at end of file