├── LICENSE ├── README.md ├── dev_docs.md ├── diagram.md ├── diagram1.png ├── faq.md ├── ideas.md ├── lipmaa.png ├── logo.png ├── message_format.md ├── roadmap.md └── sync.png /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | 3 | Version 3, 29 June 2007 4 | 5 | Copyright © 2007 Free Software Foundation, Inc. 6 | 7 | Everyone is permitted to copy and distribute verbatim copies of this license 8 | document, but changing it is not allowed. 9 | 10 | Preamble 11 | 12 | The GNU General Public License is a free, copyleft license for software and 13 | other kinds of works. 14 | 15 | The licenses for most software and other practical works are designed to take 16 | away your freedom to share and change the works. By contrast, the GNU General 17 | Public License is intended to guarantee your freedom to share and change all 18 | versions of a program--to make sure it remains free software for all its users. 19 | We, the Free Software Foundation, use the GNU General Public License for most 20 | of our software; it applies also to any other work released this way by its 21 | authors. You can apply it to your programs, too. 22 | 23 | When we speak of free software, we are referring to freedom, not price. Our 24 | General Public Licenses are designed to make sure that you have the freedom 25 | to distribute copies of free software (and charge for them if you wish), that 26 | you receive source code or can get it if you want it, that you can change 27 | the software or use pieces of it in new free programs, and that you know you 28 | can do these things. 29 | 30 | To protect your rights, we need to prevent others from denying you these rights 31 | or asking you to surrender the rights. Therefore, you have certain responsibilities 32 | if you distribute copies of the software, or if you modify it: responsibilities 33 | to respect the freedom of others. 34 | 35 | For example, if you distribute copies of such a program, whether gratis or 36 | for a fee, you must pass on to the recipients the same freedoms that you received. 37 | You must make sure that they, too, receive or can get the source code. And 38 | you must show them these terms so they know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: (1) assert 41 | copyright on the software, and (2) offer you this License giving you legal 42 | permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains that 45 | there is no warranty for this free software. For both users' and authors' 46 | sake, the GPL requires that modified versions be marked as changed, so that 47 | their problems will not be attributed erroneously to authors of previous versions. 48 | 49 | Some devices are designed to deny users access to install or run modified 50 | versions of the software inside them, although the manufacturer can do so. 51 | This is fundamentally incompatible with the aim of protecting users' freedom 52 | to change the software. The systematic pattern of such abuse occurs in the 53 | area of products for individuals to use, which is precisely where it is most 54 | unacceptable. Therefore, we have designed this version of the GPL to prohibit 55 | the practice for those products. If such problems arise substantially in other 56 | domains, we stand ready to extend this provision to those domains in future 57 | versions of the GPL, as needed to protect the freedom of users. 58 | 59 | Finally, every program is threatened constantly by software patents. States 60 | should not allow patents to restrict development and use of software on general-purpose 61 | computers, but in those that do, we wish to avoid the special danger that 62 | patents applied to a free program could make it effectively proprietary. To 63 | prevent this, the GPL assures that patents cannot be used to render the program 64 | non-free. 65 | 66 | The precise terms and conditions for copying, distribution and modification 67 | follow. 68 | 69 | TERMS AND CONDITIONS 70 | 71 | 0. Definitions. 72 | 73 | "This License" refers to version 3 of the GNU General Public License. 74 | 75 | "Copyright" also means copyright-like laws that apply to other kinds of works, 76 | such as semiconductor masks. 77 | 78 | "The Program" refers to any copyrightable work licensed under this License. 79 | Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals 80 | or organizations. 81 | 82 | To "modify" a work means to copy from or adapt all or part of the work in 83 | a fashion requiring copyright permission, other than the making of an exact 84 | copy. The resulting work is called a "modified version" of the earlier work 85 | or a work "based on" the earlier work. 86 | 87 | A "covered work" means either the unmodified Program or a work based on the 88 | Program. 89 | 90 | To "propagate" a work means to do anything with it that, without permission, 91 | would make you directly or secondarily liable for infringement under applicable 92 | copyright law, except executing it on a computer or modifying a private copy. 93 | Propagation includes copying, distribution (with or without modification), 94 | making available to the public, and in some countries other activities as 95 | well. 96 | 97 | To "convey" a work means any kind of propagation that enables other parties 98 | to make or receive copies. Mere interaction with a user through a computer 99 | network, with no transfer of a copy, is not conveying. 100 | 101 | An interactive user interface displays "Appropriate Legal Notices" to the 102 | extent that it includes a convenient and prominently visible feature that 103 | (1) displays an appropriate copyright notice, and (2) tells the user that 104 | there is no warranty for the work (except to the extent that warranties are 105 | provided), that licensees may convey the work under this License, and how 106 | to view a copy of this License. If the interface presents a list of user commands 107 | or options, such as a menu, a prominent item in the list meets this criterion. 108 | 109 | 1. Source Code. 110 | 111 | The "source code" for a work means the preferred form of the work for making 112 | modifications to it. "Object code" means any non-source form of a work. 113 | 114 | A "Standard Interface" means an interface that either is an official standard 115 | defined by a recognized standards body, or, in the case of interfaces specified 116 | for a particular programming language, one that is widely used among developers 117 | working in that language. 118 | 119 | The "System Libraries" of an executable work include anything, other than 120 | the work as a whole, that (a) is included in the normal form of packaging 121 | a Major Component, but which is not part of that Major Component, and (b) 122 | serves only to enable use of the work with that Major Component, or to implement 123 | a Standard Interface for which an implementation is available to the public 124 | in source code form. A "Major Component", in this context, means a major essential 125 | component (kernel, window system, and so on) of the specific operating system 126 | (if any) on which the executable work runs, or a compiler used to produce 127 | the work, or an object code interpreter used to run it. 128 | 129 | The "Corresponding Source" for a work in object code form means all the source 130 | code needed to generate, install, and (for an executable work) run the object 131 | code and to modify the work, including scripts to control those activities. 132 | However, it does not include the work's System Libraries, or general-purpose 133 | tools or generally available free programs which are used unmodified in performing 134 | those activities but which are not part of the work. For example, Corresponding 135 | Source includes interface definition files associated with source files for 136 | the work, and the source code for shared libraries and dynamically linked 137 | subprograms that the work is specifically designed to require, such as by 138 | intimate data communication or control flow between those subprograms and 139 | other parts of the work. 140 | 141 | The Corresponding Source need not include anything that users can regenerate 142 | automatically from other parts of the Corresponding Source. 143 | 144 | The Corresponding Source for a work in source code form is that same work. 145 | 146 | 2. Basic Permissions. 147 | 148 | All rights granted under this License are granted for the term of copyright 149 | on the Program, and are irrevocable provided the stated conditions are met. 150 | This License explicitly affirms your unlimited permission to run the unmodified 151 | Program. The output from running a covered work is covered by this License 152 | only if the output, given its content, constitutes a covered work. This License 153 | acknowledges your rights of fair use or other equivalent, as provided by copyright 154 | law. 155 | 156 | You may make, run and propagate covered works that you do not convey, without 157 | conditions so long as your license otherwise remains in force. You may convey 158 | covered works to others for the sole purpose of having them make modifications 159 | exclusively for you, or provide you with facilities for running those works, 160 | provided that you comply with the terms of this License in conveying all material 161 | for which you do not control copyright. Those thus making or running the covered 162 | works for you must do so exclusively on your behalf, under your direction 163 | and control, on terms that prohibit them from making any copies of your copyrighted 164 | material outside their relationship with you. 165 | 166 | Conveying under any other circumstances is permitted solely under the conditions 167 | stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 168 | 169 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 170 | 171 | No covered work shall be deemed part of an effective technological measure 172 | under any applicable law fulfilling obligations under article 11 of the WIPO 173 | copyright treaty adopted on 20 December 1996, or similar laws prohibiting 174 | or restricting circumvention of such measures. 175 | 176 | When you convey a covered work, you waive any legal power to forbid circumvention 177 | of technological measures to the extent such circumvention is effected by 178 | exercising rights under this License with respect to the covered work, and 179 | you disclaim any intention to limit operation or modification of the work 180 | as a means of enforcing, against the work's users, your or third parties' 181 | legal rights to forbid circumvention of technological measures. 182 | 183 | 4. Conveying Verbatim Copies. 184 | 185 | You may convey verbatim copies of the Program's source code as you receive 186 | it, in any medium, provided that you conspicuously and appropriately publish 187 | on each copy an appropriate copyright notice; keep intact all notices stating 188 | that this License and any non-permissive terms added in accord with section 189 | 7 apply to the code; keep intact all notices of the absence of any warranty; 190 | and give all recipients a copy of this License along with the Program. 191 | 192 | You may charge any price or no price for each copy that you convey, and you 193 | may offer support or warranty protection for a fee. 194 | 195 | 5. Conveying Modified Source Versions. 196 | 197 | You may convey a work based on the Program, or the modifications to produce 198 | it from the Program, in the form of source code under the terms of section 199 | 4, provided that you also meet all of these conditions: 200 | 201 | a) The work must carry prominent notices stating that you modified it, and 202 | giving a relevant date. 203 | 204 | b) The work must carry prominent notices stating that it is released under 205 | this License and any conditions added under section 7. This requirement modifies 206 | the requirement in section 4 to "keep intact all notices". 207 | 208 | c) You must license the entire work, as a whole, under this License to anyone 209 | who comes into possession of a copy. This License will therefore apply, along 210 | with any applicable section 7 additional terms, to the whole of the work, 211 | and all its parts, regardless of how they are packaged. This License gives 212 | no permission to license the work in any other way, but it does not invalidate 213 | such permission if you have separately received it. 214 | 215 | d) If the work has interactive user interfaces, each must display Appropriate 216 | Legal Notices; however, if the Program has interactive interfaces that do 217 | not display Appropriate Legal Notices, your work need not make them do so. 218 | 219 | A compilation of a covered work with other separate and independent works, 220 | which are not by their nature extensions of the covered work, and which are 221 | not combined with it such as to form a larger program, in or on a volume of 222 | a storage or distribution medium, is called an "aggregate" if the compilation 223 | and its resulting copyright are not used to limit the access or legal rights 224 | of the compilation's users beyond what the individual works permit. Inclusion 225 | of a covered work in an aggregate does not cause this License to apply to 226 | the other parts of the aggregate. 227 | 228 | 6. Conveying Non-Source Forms. 229 | 230 | You may convey a covered work in object code form under the terms of sections 231 | 4 and 5, provided that you also convey the machine-readable Corresponding 232 | Source under the terms of this License, in one of these ways: 233 | 234 | a) Convey the object code in, or embodied in, a physical product (including 235 | a physical distribution medium), accompanied by the Corresponding Source fixed 236 | on a durable physical medium customarily used for software interchange. 237 | 238 | b) Convey the object code in, or embodied in, a physical product (including 239 | a physical distribution medium), accompanied by a written offer, valid for 240 | at least three years and valid for as long as you offer spare parts or customer 241 | support for that product model, to give anyone who possesses the object code 242 | either (1) a copy of the Corresponding Source for all the software in the 243 | product that is covered by this License, on a durable physical medium customarily 244 | used for software interchange, for a price no more than your reasonable cost 245 | of physically performing this conveying of source, or (2) access to copy the 246 | Corresponding Source from a network server at no charge. 247 | 248 | c) Convey individual copies of the object code with a copy of the written 249 | offer to provide the Corresponding Source. This alternative is allowed only 250 | occasionally and noncommercially, and only if you received the object code 251 | with such an offer, in accord with subsection 6b. 252 | 253 | d) Convey the object code by offering access from a designated place (gratis 254 | or for a charge), and offer equivalent access to the Corresponding Source 255 | in the same way through the same place at no further charge. You need not 256 | require recipients to copy the Corresponding Source along with the object 257 | code. If the place to copy the object code is a network server, the Corresponding 258 | Source may be on a different server (operated by you or a third party) that 259 | supports equivalent copying facilities, provided you maintain clear directions 260 | next to the object code saying where to find the Corresponding Source. Regardless 261 | of what server hosts the Corresponding Source, you remain obligated to ensure 262 | that it is available for as long as needed to satisfy these requirements. 263 | 264 | e) Convey the object code using peer-to-peer transmission, provided you inform 265 | other peers where the object code and Corresponding Source of the work are 266 | being offered to the general public at no charge under subsection 6d. 267 | 268 | A separable portion of the object code, whose source code is excluded from 269 | the Corresponding Source as a System Library, need not be included in conveying 270 | the object code work. 271 | 272 | A "User Product" is either (1) a "consumer product", which means any tangible 273 | personal property which is normally used for personal, family, or household 274 | purposes, or (2) anything designed or sold for incorporation into a dwelling. 275 | In determining whether a product is a consumer product, doubtful cases shall 276 | be resolved in favor of coverage. For a particular product received by a particular 277 | user, "normally used" refers to a typical or common use of that class of product, 278 | regardless of the status of the particular user or of the way in which the 279 | particular user actually uses, or expects or is expected to use, the product. 280 | A product is a consumer product regardless of whether the product has substantial 281 | commercial, industrial or non-consumer uses, unless such uses represent the 282 | only significant mode of use of the product. 283 | 284 | "Installation Information" for a User Product means any methods, procedures, 285 | authorization keys, or other information required to install and execute modified 286 | versions of a covered work in that User Product from a modified version of 287 | its Corresponding Source. The information must suffice to ensure that the 288 | continued functioning of the modified object code is in no case prevented 289 | or interfered with solely because modification has been made. 290 | 291 | If you convey an object code work under this section in, or with, or specifically 292 | for use in, a User Product, and the conveying occurs as part of a transaction 293 | in which the right of possession and use of the User Product is transferred 294 | to the recipient in perpetuity or for a fixed term (regardless of how the 295 | transaction is characterized), the Corresponding Source conveyed under this 296 | section must be accompanied by the Installation Information. But this requirement 297 | does not apply if neither you nor any third party retains the ability to install 298 | modified object code on the User Product (for example, the work has been installed 299 | in ROM). 300 | 301 | The requirement to provide Installation Information does not include a requirement 302 | to continue to provide support service, warranty, or updates for a work that 303 | has been modified or installed by the recipient, or for the User Product in 304 | which it has been modified or installed. Access to a network may be denied 305 | when the modification itself materially and adversely affects the operation 306 | of the network or violates the rules and protocols for communication across 307 | the network. 308 | 309 | Corresponding Source conveyed, and Installation Information provided, in accord 310 | with this section must be in a format that is publicly documented (and with 311 | an implementation available to the public in source code form), and must require 312 | no special password or key for unpacking, reading or copying. 313 | 314 | 7. Additional Terms. 315 | 316 | "Additional permissions" are terms that supplement the terms of this License 317 | by making exceptions from one or more of its conditions. Additional permissions 318 | that are applicable to the entire Program shall be treated as though they 319 | were included in this License, to the extent that they are valid under applicable 320 | law. If additional permissions apply only to part of the Program, that part 321 | may be used separately under those permissions, but the entire Program remains 322 | governed by this License without regard to the additional permissions. 323 | 324 | When you convey a copy of a covered work, you may at your option remove any 325 | additional permissions from that copy, or from any part of it. (Additional 326 | permissions may be written to require their own removal in certain cases when 327 | you modify the work.) You may place additional permissions on material, added 328 | by you to a covered work, for which you have or can give appropriate copyright 329 | permission. 330 | 331 | Notwithstanding any other provision of this License, for material you add 332 | to a covered work, you may (if authorized by the copyright holders of that 333 | material) supplement the terms of this License with terms: 334 | 335 | a) Disclaiming warranty or limiting liability differently from the terms of 336 | sections 15 and 16 of this License; or 337 | 338 | b) Requiring preservation of specified reasonable legal notices or author 339 | attributions in that material or in the Appropriate Legal Notices displayed 340 | by works containing it; or 341 | 342 | c) Prohibiting misrepresentation of the origin of that material, or requiring 343 | that modified versions of such material be marked in reasonable ways as different 344 | from the original version; or 345 | 346 | d) Limiting the use for publicity purposes of names of licensors or authors 347 | of the material; or 348 | 349 | e) Declining to grant rights under trademark law for use of some trade names, 350 | trademarks, or service marks; or 351 | 352 | f) Requiring indemnification of licensors and authors of that material by 353 | anyone who conveys the material (or modified versions of it) with contractual 354 | assumptions of liability to the recipient, for any liability that these contractual 355 | assumptions directly impose on those licensors and authors. 356 | 357 | All other non-permissive additional terms are considered "further restrictions" 358 | within the meaning of section 10. If the Program as you received it, or any 359 | part of it, contains a notice stating that it is governed by this License 360 | along with a term that is a further restriction, you may remove that term. 361 | If a license document contains a further restriction but permits relicensing 362 | or conveying under this License, you may add to a covered work material governed 363 | by the terms of that license document, provided that the further restriction 364 | does not survive such relicensing or conveying. 365 | 366 | If you add terms to a covered work in accord with this section, you must place, 367 | in the relevant source files, a statement of the additional terms that apply 368 | to those files, or a notice indicating where to find the applicable terms. 369 | 370 | Additional terms, permissive or non-permissive, may be stated in the form 371 | of a separately written license, or stated as exceptions; the above requirements 372 | apply either way. 373 | 374 | 8. Termination. 375 | 376 | You may not propagate or modify a covered work except as expressly provided 377 | under this License. Any attempt otherwise to propagate or modify it is void, 378 | and will automatically terminate your rights under this License (including 379 | any patent licenses granted under the third paragraph of section 11). 380 | 381 | However, if you cease all violation of this License, then your license from 382 | a particular copyright holder is reinstated (a) provisionally, unless and 383 | until the copyright holder explicitly and finally terminates your license, 384 | and (b) permanently, if the copyright holder fails to notify you of the violation 385 | by some reasonable means prior to 60 days after the cessation. 386 | 387 | Moreover, your license from a particular copyright holder is reinstated permanently 388 | if the copyright holder notifies you of the violation by some reasonable means, 389 | this is the first time you have received notice of violation of this License 390 | (for any work) from that copyright holder, and you cure the violation prior 391 | to 30 days after your receipt of the notice. 392 | 393 | Termination of your rights under this section does not terminate the licenses 394 | of parties who have received copies or rights from you under this License. 395 | If your rights have been terminated and not permanently reinstated, you do 396 | not qualify to receive new licenses for the same material under section 10. 397 | 398 | 9. Acceptance Not Required for Having Copies. 399 | 400 | You are not required to accept this License in order to receive or run a copy 401 | of the Program. Ancillary propagation of a covered work occurring solely as 402 | a consequence of using peer-to-peer transmission to receive a copy likewise 403 | does not require acceptance. However, nothing other than this License grants 404 | you permission to propagate or modify any covered work. These actions infringe 405 | copyright if you do not accept this License. Therefore, by modifying or propagating 406 | a covered work, you indicate your acceptance of this License to do so. 407 | 408 | 10. Automatic Licensing of Downstream Recipients. 409 | 410 | Each time you convey a covered work, the recipient automatically receives 411 | a license from the original licensors, to run, modify and propagate that work, 412 | subject to this License. You are not responsible for enforcing compliance 413 | by third parties with this License. 414 | 415 | An "entity transaction" is a transaction transferring control of an organization, 416 | or substantially all assets of one, or subdividing an organization, or merging 417 | organizations. If propagation of a covered work results from an entity transaction, 418 | each party to that transaction who receives a copy of the work also receives 419 | whatever licenses to the work the party's predecessor in interest had or could 420 | give under the previous paragraph, plus a right to possession of the Corresponding 421 | Source of the work from the predecessor in interest, if the predecessor has 422 | it or can get it with reasonable efforts. 423 | 424 | You may not impose any further restrictions on the exercise of the rights 425 | granted or affirmed under this License. For example, you may not impose a 426 | license fee, royalty, or other charge for exercise of rights granted under 427 | this License, and you may not initiate litigation (including a cross-claim 428 | or counterclaim in a lawsuit) alleging that any patent claim is infringed 429 | by making, using, selling, offering for sale, or importing the Program or 430 | any portion of it. 431 | 432 | 11. Patents. 433 | 434 | A "contributor" is a copyright holder who authorizes use under this License 435 | of the Program or a work on which the Program is based. The work thus licensed 436 | is called the contributor's "contributor version". 437 | 438 | A contributor's "essential patent claims" are all patent claims owned or controlled 439 | by the contributor, whether already acquired or hereafter acquired, that would 440 | be infringed by some manner, permitted by this License, of making, using, 441 | or selling its contributor version, but do not include claims that would be 442 | infringed only as a consequence of further modification of the contributor 443 | version. For purposes of this definition, "control" includes the right to 444 | grant patent sublicenses in a manner consistent with the requirements of this 445 | License. 446 | 447 | Each contributor grants you a non-exclusive, worldwide, royalty-free patent 448 | license under the contributor's essential patent claims, to make, use, sell, 449 | offer for sale, import and otherwise run, modify and propagate the contents 450 | of its contributor version. 451 | 452 | In the following three paragraphs, a "patent license" is any express agreement 453 | or commitment, however denominated, not to enforce a patent (such as an express 454 | permission to practice a patent or covenant not to sue for patent infringement). 455 | To "grant" such a patent license to a party means to make such an agreement 456 | or commitment not to enforce a patent against the party. 457 | 458 | If you convey a covered work, knowingly relying on a patent license, and the 459 | Corresponding Source of the work is not available for anyone to copy, free 460 | of charge and under the terms of this License, through a publicly available 461 | network server or other readily accessible means, then you must either (1) 462 | cause the Corresponding Source to be so available, or (2) arrange to deprive 463 | yourself of the benefit of the patent license for this particular work, or 464 | (3) arrange, in a manner consistent with the requirements of this License, 465 | to extend the patent license to downstream recipients. "Knowingly relying" 466 | means you have actual knowledge that, but for the patent license, your conveying 467 | the covered work in a country, or your recipient's use of the covered work 468 | in a country, would infringe one or more identifiable patents in that country 469 | that you have reason to believe are valid. 470 | 471 | If, pursuant to or in connection with a single transaction or arrangement, 472 | you convey, or propagate by procuring conveyance of, a covered work, and grant 473 | a patent license to some of the parties receiving the covered work authorizing 474 | them to use, propagate, modify or convey a specific copy of the covered work, 475 | then the patent license you grant is automatically extended to all recipients 476 | of the covered work and works based on it. 477 | 478 | A patent license is "discriminatory" if it does not include within the scope 479 | of its coverage, prohibits the exercise of, or is conditioned on the non-exercise 480 | of one or more of the rights that are specifically granted under this License. 481 | You may not convey a covered work if you are a party to an arrangement with 482 | a third party that is in the business of distributing software, under which 483 | you make payment to the third party based on the extent of your activity of 484 | conveying the work, and under which the third party grants, to any of the 485 | parties who would receive the covered work from you, a discriminatory patent 486 | license (a) in connection with copies of the covered work conveyed by you 487 | (or copies made from those copies), or (b) primarily for and in connection 488 | with specific products or compilations that contain the covered work, unless 489 | you entered into that arrangement, or that patent license was granted, prior 490 | to 28 March 2007. 491 | 492 | Nothing in this License shall be construed as excluding or limiting any implied 493 | license or other defenses to infringement that may otherwise be available 494 | to you under applicable patent law. 495 | 496 | 12. No Surrender of Others' Freedom. 497 | 498 | If conditions are imposed on you (whether by court order, agreement or otherwise) 499 | that contradict the conditions of this License, they do not excuse you from 500 | the conditions of this License. If you cannot convey a covered work so as 501 | to satisfy simultaneously your obligations under this License and any other 502 | pertinent obligations, then as a consequence you may not convey it at all. 503 | For example, if you agree to terms that obligate you to collect a royalty 504 | for further conveying from those to whom you convey the Program, the only 505 | way you could satisfy both those terms and this License would be to refrain 506 | entirely from conveying the Program. 507 | 508 | 13. Use with the GNU Affero General Public License. 509 | 510 | Notwithstanding any other provision of this License, you have permission to 511 | link or combine any covered work with a work licensed under version 3 of the 512 | GNU Affero General Public License into a single combined work, and to convey 513 | the resulting work. The terms of this License will continue to apply to the 514 | part which is the covered work, but the special requirements of the GNU Affero 515 | General Public License, section 13, concerning interaction through a network 516 | will apply to the combination as such. 517 | 518 | 14. Revised Versions of this License. 519 | 520 | The Free Software Foundation may publish revised and/or new versions of the 521 | GNU General Public License from time to time. Such new versions will be similar 522 | in spirit to the present version, but may differ in detail to address new 523 | problems or concerns. 524 | 525 | Each version is given a distinguishing version number. If the Program specifies 526 | that a certain numbered version of the GNU General Public License "or any 527 | later version" applies to it, you have the option of following the terms and 528 | conditions either of that numbered version or of any later version published 529 | by the Free Software Foundation. If the Program does not specify a version 530 | number of the GNU General Public License, you may choose any version ever 531 | published by the Free Software Foundation. 532 | 533 | If the Program specifies that a proxy can decide which future versions of 534 | the GNU General Public License can be used, that proxy's public statement 535 | of acceptance of a version permanently authorizes you to choose that version 536 | for the Program. 537 | 538 | Later license versions may give you additional or different permissions. However, 539 | no additional obligations are imposed on any author or copyright holder as 540 | a result of your choosing to follow a later version. 541 | 542 | 15. Disclaimer of Warranty. 543 | 544 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE 545 | LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 546 | OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER 547 | EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 548 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 549 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM 550 | PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR 551 | CORRECTION. 552 | 553 | 16. Limitation of Liability. 554 | 555 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL 556 | ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM 557 | AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, 558 | INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO 559 | USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED 560 | INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE 561 | PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER 562 | PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 563 | 564 | 17. Interpretation of Sections 15 and 16. 565 | 566 | If the disclaimer of warranty and limitation of liability provided above cannot 567 | be given local legal effect according to their terms, reviewing courts shall 568 | apply local law that most closely approximates an absolute waiver of all civil 569 | liability in connection with the Program, unless a warranty or assumption 570 | of liability accompanies a copy of the Program in return for a fee. END OF 571 | TERMS AND CONDITIONS 572 | 573 | How to Apply These Terms to Your New Programs 574 | 575 | If you develop a new program, and you want it to be of the greatest possible 576 | use to the public, the best way to achieve this is to make it free software 577 | which everyone can redistribute and change under these terms. 578 | 579 | To do so, attach the following notices to the program. It is safest to attach 580 | them to the start of each source file to most effectively state the exclusion 581 | of warranty; and each file should have at least the "copyright" line and a 582 | pointer to where the full notice is found. 583 | 584 | 585 | 586 | Copyright (C) 587 | 588 | This program is free software: you can redistribute it and/or modify it under 589 | the terms of the GNU General Public License as published by the Free Software 590 | Foundation, either version 3 of the License, or (at your option) any later 591 | version. 592 | 593 | This program is distributed in the hope that it will be useful, but WITHOUT 594 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 595 | FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 596 | 597 | You should have received a copy of the GNU General Public License along with 598 | this program. If not, see . 599 | 600 | Also add information on how to contact you by electronic and paper mail. 601 | 602 | If the program does terminal interaction, make it output a short notice like 603 | this when it starts in an interactive mode: 604 | 605 | Copyright (C) 606 | 607 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 608 | 609 | This is free software, and you are welcome to redistribute it under certain 610 | conditions; type `show c' for details. 611 | 612 | The hypothetical commands `show w' and `show c' should show the appropriate 613 | parts of the General Public License. Of course, your program's commands might 614 | be different; for a GUI interface, you would use an "about box". 615 | 616 | You should also get your employer (if you work as a programmer) or school, 617 | if any, to sign a "copyright disclaimer" for the program, if necessary. For 618 | more information on this, and how to apply and follow the GNU GPL, see . 620 | 621 | The GNU General Public License does not permit incorporating your program 622 | into proprietary programs. If your program is a subroutine library, you may 623 | consider it more useful to permit linking proprietary applications with the 624 | library. If this is what you want to do, use the GNU Lesser General Public 625 | License instead of this License. But first, please read . 627 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](logo.png) 2 | 3 | # The Pigeon protocol 4 | 5 | The Pigeon protocol is an off-grid, serverless, peer-to-peer protocol 6 | for building software that works on poor internet connections, or 7 | entirely offline. 8 | 9 | 10 | # Project Status 11 | 12 | HIBERNATION. Pigeon was an exploration of ideas that I embarked on in 2020. Now (2021) I am changing my focus. If more people are interested in the project I might start work on it again. Please let me know by raising an issue. For now, I am shifting my focus to other areas unless interest in the project changes. 13 | 14 | # Table of contents 15 | 16 | - [Introduction](#introduction) 17 | - [Why build software that follows the Pigeon protocol?](#why-build-software-that-follows-the-pigeon-protocol) 18 | - [How does the Pigeon protocol benefit users?](#how-does-the-pigeon-protocol-benefit-users) 19 | - [Data is backed up by default](#data-is-backed-up-by-default) 20 | - [Data can be shared anywhere](#data-can-be-shared-anywhere) 21 | - [Data is tamper-resistant](#data-is-tamper-resistant) 22 | - [Data is always available](#data-is-always-available) 23 | - [Use-case scenarios](#use-case-scenarios) 24 | - [Software implementation ideas](#software-implementation-ideas) 25 | - [Implementations](#implementations) 26 | - [How does the Pigeon protocol work?](#how-does-the-pigeon-protocol-work) 27 | - [What do Pigeon messages look like as data?](#what-do-pigeon-messages-look-like-as-data) 28 | - [Constraints and Design Philosophy](#constraints-and-design-philosophy) 29 | - [What the Pigeon protocol is not trying to address](#what-the-pigeon-protocol-is-not-trying-to-address) 30 | - [How the Pigeon protocol differs from Sneakernet](#how-the-pigeon-protocol-differs-from-sneakernet) 31 | - [How the Pigeon protocol differs From Secure Scuttlebutt](#how-the-pigeon-protocol-differs-from-secure-scuttlebutt) 32 | - [Influences](#influences) 33 | - [Getting involved with the Pigeon protocol development](#getting-involved-with-the-pigeon-protocol-development) 34 | - [For more information](#for-more-information) 35 | 36 | # Introduction 37 | 38 | This document will describe why you may want to build software that 39 | follows the Pigeon protocol, how the protocol works, and how you can 40 | write software that follows this protocol. 41 | 42 | This document provides a reference to the Pigeon protocol 43 | specifications, and is written for developers. 44 | 45 | # Why build software that follows the Pigeon protocol? 46 | 47 | Software that follows the Pigeon protocol can operate online or 48 | offline, regardless of connectivity quality. This allows you to focus 49 | on software development, instead of worrying about network types and 50 | quality, or third-party services. 51 | 52 | # How does the Pigeon protocol benefit users? 53 | 54 | The Pigeon protocol outlines several ways users can benefit from using 55 | software that follows this protocol. 56 | 57 | This section consists of the following subsections: 58 | 59 | - [Data is backed up by default](#data-is-backed-up-by-default) 60 | - [Data can be shared anywhere](#data-can-be-shared-anywhere) 61 | - [Data is tamper-resistant](#data-is-tamper-resistant) 62 | - [Data is always available](#data-is-always-available) 63 | 64 | ## Data is backed up by default 65 | 66 | Software that follows the Pigeon protocol allows users to store data 67 | on their nodes, and copy their data to other nodes. By copying data to 68 | other nodes, this not only backs up data, but also provides users with 69 | data they can access offline. 70 | 71 | ## Data can be shared anywhere 72 | 73 | Every user in the mesh has a local database. You can share your 74 | database entries anywhere, such as CD-R, email, public forums, and 75 | [USB dead drops](https://en.wikipedia.org/wiki/USB_dead_drop). 76 | 77 | ## Data is tamper-resistant 78 | 79 | Entries in the database are cryptographically signed. Because the 80 | entries are signed, you don't have to worry about malicious third 81 | parties tampering with your data. 82 | 83 | ## Data is always available 84 | 85 | Any data the user is currently accessing is already available offline, 86 | and in case of a sudden internet outage, or poor connectivity issues, 87 | the access to the data is not affected, because the data doesn't rely 88 | on an internet connection. 89 | 90 | You can "follow" peers, by copying their database to your 91 | machine. Updates are performed by retrieving newer bundles from your 92 | peers. This allows you to share your peers' bundles on behalf of 93 | them. This is useful when the peer is unavailable and another peer 94 | wants their bundle. 95 | 96 | The act of sharing peers' data on behalf of other peers is called 97 | "gossiping". 98 | 99 | # Use-case scenarios 100 | 101 | The Pigeon protocol may be useful in scenarios such as: 102 | 103 | * Systems with low connectivity or uptime such as remote sensor 104 | logging, maritime systems, solar systems with intermittent power, 105 | IoT systems with poor network connectivity. 106 | * Store-and-forward message gateways, such as a 107 | [data mule](https://en.wikipedia.org/wiki/Data_mule). 108 | * Censorship resistant applications, such as peer-to-peer messaging 109 | and blogging. 110 | * [Delay tolerant networking](https://en.wikipedia.org/wiki/Delay-tolerant_networking) 111 | * Applications that require a high level of data-integrity or 112 | auditing. 113 | * Delay-tolerant peer-to-peer social networks, games, file sharing 114 | etc... 115 | * Time series data storage 116 | 117 | # Software implementation ideas 118 | 119 | * A messenger application 120 | * An IoT data logger 121 | * A newsgroup or [NNTP](https://en.wikipedia.org/wiki/Network_News_Transfer_Protocol) analog 122 | * A turn-based board game 123 | * A microblogging social network 124 | * An e-commerce application for P2P cryptocurrency users 125 | * A Secure Scuttlebutt import / export / gateway tool 126 | * A social mapping / point-of-interest sharing site 127 | * A Bluetooth file sharing application 128 | * A graphical database browser for developers that want to use the 129 | protocol for log storage or as a time series database 130 | * A synchronization system over actual pigeons, possibly soliciting 131 | help from the world-famous boxer and pigeon-racing enthusiast, Mike 132 | Tyson 133 | 134 | # Implementations 135 | 136 | There is currently one working implementation available 137 | [here](https://github.com/PigeonProtocolConsortium/pigeon-cli-ruby). 138 | A long term goal is to support all major platforms and languages. 139 | 140 | # How does the Pigeon protocol work? 141 | 142 | Each node in a social network of peers has a local "log". The log is an 143 | append-only feed of messages written in an ASCII-based serialization 144 | format. 145 | 146 | Messages are signed with a secret key to validate a message's 147 | integrity and to prevent tampering by malicious peers. 148 | 149 | Nodes in the social network "follow" other logs from peers. Nodes replicate the 150 | logs of their peers and "gossip" information about peers across the 151 | social network. 152 | 153 | Gossip information is packaged into "bundles" which contain backups of 154 | peer logs in a format that can be transmitted through sneakernet, 155 | direct serial connection, or any high-throughput medium, regardless of 156 | latency. 157 | 158 | Log synchronization through Sneakernet is the main use case for Pigeon 159 | messages to be transmitted. SD Cards sent via postal mail offer an 160 | excellent medium for transmission of Pigeon messages, although any 161 | data transfer medium is possible. 162 | 163 | ![](sync.png) 164 | 165 | # What do Pigeon messages look like as data? 166 | 167 | Pigeon messages use a custom ASCII-based encoding scheme, as seen in 168 | **Example 1** and **Example 2** below. 169 | 170 | **Note**: Although the message encoding scheme is human-readable the 171 | messages should be parsed by third-party applications rather than 172 | written by hand. 173 | 174 | **Example 1**: 175 | 176 | ``` 177 | author USER.R68Q26P1GEFC0SNVVQ9S29SWCVVRGCYRV7D96GAN3XVQE3F9AZJ0 178 | depth 0 179 | kind my_blog 180 | prev NONE 181 | 182 | current_status:"Another great day. Nice weather, too!" 183 | 184 | signature 2VMAG4SCX5RHVBKCB1RNZCB0AJN4WN6FEMS7W9FM1CVYSZXMX7CPQFCDPYEKCTGG91Y1YSGY4G5K8XAGQ67HEPDFRMRYQHWQBATAC2R 185 | 186 | ``` 187 | 188 | **Example 2**: 189 | 190 | ``` 191 | author USER.R68Q26P1GEFC0SNVVQ9S29SWCVVRGCYRV7D96GAN3XVQE3F9AZJ0 192 | depth 1 193 | kind like 194 | prev TEXT.6CBA4J3756A5SNM1W1GHNCTT9EG95ZP3ZMAT5Z1EJP7TXMNNVZC0 195 | 196 | liked_post_multihash:TEXT.6CBA4J3756A5SNM1W1GHNCTT9EG95ZP3ZMAT5Z1EJP7TXMNNVZC0 197 | 198 | signature Y34Q47V0BY370RM5KWGRJRN9HFNGJN0C3DEYVB2V2476CW9RN5HD4XD7KMQ6T4T42N36R5P3XX6E3FYEWVZR25AVCF6KQPZHJP6EM10 199 | 200 | ``` 201 | 202 | ![A hierarchy diagram showing how the message in example 2 points back to example 1, and how example 1 points back to NONE](diagram1.png) 203 | 204 | For examples of how messages are handled, see the Ruby-implementation tutorial 205 | [here](https://github.com/PigeonProtocolConsortium/pigeon-cli-ruby/blob/main/ruby_tutorial.md) 206 | 207 | # Constraints and Design Philosophy 208 | 209 | * Offline-first means offline-only. Never incorporate TCP or UDP 210 | features. TCP- or UDP-related concerns must be handled by 211 | higher-level protocols or by application developers. This is to 212 | ensure the protocol is always an option for off-grid usage. 213 | 214 | 215 | * Natural is better than simple. Convention over configuration. Do 216 | not make plugins for common use cases unless it would hurt 217 | portability. 218 | 219 | * Prefer a monolithic internal structure. Avoid external dependencies 220 | except for limited use cases (Eg: crypto libs). Do not break things 221 | into smaller pieces until there are at least three real-world 222 | reasons to do so. Decoupling a library into a package for only 2 223 | use cases is not acceptable. 224 | 225 | * Maintain ecosystem diversity by having a protocol that can be 226 | easily and entirely ported to new languages and platforms. 227 | 228 | * No singletons. No signing authorities, no servers of any kind, even 229 | locally, no differentiation between peers (eg: no "super peers"). 230 | 231 | * Configuration is always a design compromise. We will allow a limit 232 | of 10 configuration options for all eternity. These are simple 233 | key/value pairs. No nesting, no namespacing, no dots, no dashes, no 234 | nested config names, no arrays, none of that crap. Seriously, I'm 235 | watching you. 236 | 237 | * Assume CPU and RAM are not plentiful. 238 | 239 | * Assume platform has no networking support. No servers. No hooks for 240 | startup, shutdown, or reboot. 241 | 242 | * Assume block storage is plentiful when making resource allocation 243 | trade-offs. 244 | 245 | * Files are better than sessions, but be filesystem 246 | agnostic. Persistence mechanisms are implementation-specific. 247 | 248 | * Provide tamper resistance. Privacy features will be added later. 249 | 250 | * Enable "Free listening" 251 | 252 | * Have a formal specification (reference implementations are not OK). 253 | 254 | * Minimize conceptual overhead (If it's not needed at least 80% of 255 | the time, don't add it). 256 | 257 | * Use a serialization format that is deterministic and easy to parse 258 | on constrained devices. 259 | 260 | * Backwards compatibility. Numerous compromises have been made to 261 | support legacy systems, such as devices that use FAT16 file systems or lack network support. 262 | 263 | # What the Pigeon protocol is not trying to address 264 | 265 | * Networking support: The protocol will make no mention of TCP, UDP, 266 | SSH, HTTP, Etc.. 267 | * Configurability: Configuration is the root of all evil. Instead of 268 | trying to create something that serves every use case, focus on 269 | over 80% use cases and allow edge cases to be handled by 270 | application developers. 271 | * Anonymity: Though pseudonymity is possible via the use of multiple 272 | identities, the concept of anonymity is not well suited to this 273 | protocol. Every message is signed by a known identity, though 274 | identities are easily created and can be backed by pseudonyms for 275 | privacy. 276 | * OPEN TO DISCUSSION: Encryption. Like many internet protocols, 277 | encryption concerns are offloaded to the transport layer. Consider 278 | using an encrypted file system or encrypted compression application 279 | to store data. If you have ideas on how we could support encryption, 280 | please contact us. Please keep in mind that anonymity is not 281 | necessarily a project goal. 282 | 283 | # How the Pigeon protocol differs from Sneakernet 284 | 285 | [Sneakernet](https://en.wikipedia.org/wiki/Sneakernet) is a protocol 286 | used by ancient civilizations to exchange files between computers with 287 | limited internet connectivity. 288 | 289 | Although the Pigeon protocol messages can be exchanged over 290 | sneakernet, the Pigeon protocol is _not_ sneakernet. Sneakernet 291 | messages by themselves are not tamper-resistant, nor does it provide 292 | redundant backup using peers. 293 | 294 | In contrast, a Pigeon protocol message is redundantly replicated 295 | _beyond_ its intended recipient to neighboring peers, "a friend of a 296 | friend", through gossip. Unlike sneakernet, the Pigeon protocol also 297 | uses cryptography to guarantee that a message's content has not been 298 | altered by a third party. 299 | 300 | # How the Pigeon protocol differs From Secure Scuttlebutt 301 | 302 | [Secure Scuttlebut](https://scuttlebutt.nz/) is a decentralized, 303 | peer-to-peer protocol that also works offline. 304 | 305 | The Pigeon protocol does not rely on networking in the core 306 | library. Although Secure Scuttlebutt is able to support 307 | Sneakernet-only operation, it is difficult in practice due to reliance 308 | on UDP, TCP, and in the case of 309 | [pubs](https://github.com/ssbc/ssb-server/wiki/Pub-Servers), DNS. 310 | 311 | The Pigeon protocol uses a custom key/value serialization format 312 | instead of JSON. This has two benefits: 313 | 314 | * Serialization and signing is more simple, because indentation and 315 | whitespace are less likely to cause verification problems. 316 | * Unlike JSON, pigeon messages do not allow nesting, which promotes 317 | simplified message schemas. 318 | 319 | The Pigeon protocol uses Crockford-flavored Base32 rather than URL 320 | safe Base64. This makes it easier to support old or low-powered 321 | systems and is easier to support FAT16 or embedded systems. 322 | 323 | Unlike Secure Scuttlebutt, the Pigeon protocol was designed for 324 | portability and simplicity. It allows support for platforms that 325 | aren't limited to NodeJS. 326 | 327 | Complicated features, such as network support, are ignored in favor of 328 | an easy-to-implement standard. 329 | 330 | # Influences 331 | 332 | Pigeon borrows many of the ideas set forth by the 333 | [Secure Scuttlebutt protocol](https://ssbc.github.io/scuttlebutt-protocol-guide/). 334 | It is our opinion that SSB is one of the most innovative protocols 335 | created in recent years. Without the research and efforts of the 336 | [Secure Scuttlebutt Consortium](https://github.com/ssbc) 337 | , this project would not be possible, so a big thanks goes out to all 338 | the people who make SSB possible. 339 | 340 | We've also been inspired by the compactness and minimalism of 341 | [SQLite, which should serve as a role model for all of us](https://www.sqlite.org/talks/wroclaw-20090310.pdf). 342 | 343 | In many ways, this protocol can be considered an amalgam of the best 344 | ideas from both SQLite and Secure Scuttlebutt. 345 | 346 | # Getting involved with the Pigeon protocol development 347 | 348 | **PIGEON PROTOCOL DEVELOPERS MAILING LIST:** Send an email with "subscribe" in the subject line to `pigeon_developers@vaporsoft.xyz`. 349 | 350 | If you want to be involved with the Pigeon protocol development, there 351 | are areas we need help in currently: 352 | 353 | * Documentation, editors, and feedback. 354 | * We need applications to be built using the protocol! We are happy to 355 | assist you along the way. 356 | * We need a BNF grammar for Pigeon messages. 357 | 358 | Your feedback really helps. Feel free to email us your opinions and 359 | ideas at `contact at vaporsoft.xyz`. We will reply to all messages. 360 | 361 | # For more information 362 | 363 | Check out the following links: 364 | 365 | * [Message Format Specification](message_format.md) 366 | * [Bundle Format Specification](dev_docs.md) 367 | * [Frequently Asked Questions](faq.md) 368 | * [Roadmap](roadmap.md) 369 | * [Ideas and Features](ideas.md) 370 | 371 | TODO: 372 | 373 | * Explain what forking is and why it is not supported. 374 | * Explain how verification happens (Soapdog) 375 | * Question: "How do apps find what they need in the Pigeon feeds and/or accumulate state forward? Is this the responsibility of the Pigeon libraries, or do apps do it themselves?" 376 | -------------------------------------------------------------------------------- /dev_docs.md: -------------------------------------------------------------------------------- 1 | # Fundamental Concept: Free Listening 2 | 3 | The concept of "Free Listening" is mentioned often when developing the protocol. The original concept is borrowed from the Secure Scuttlebutt protocol and is well summarized in [a 2018 work by Andre Staltz](https://staltz.com/reinvent-the-social-web.html): 4 | 5 | ``` 6 | Pull is the opposite of push. Instead of realtime push notifications, you choose when you want to get updates about new content. Instead of free speech, as in the right to broadcast, we value free listening, which is the right not to be shouted at. Most social networks allow people to basically insert—push—themselves into a community. But Scuttlebutt invites are the other way around: someone in the community has to pull you in. 7 | 8 | We are not proponents of total self-reliance. With full independence, you’d just be a lonely node in your social graph. The real value of the social graph is not the amount of nodes, it’s the amount of edges. They represent dependence on each other. 9 | 10 | Your friend is your backup, literally. If you happen to lose all your data because your computer explodes, all you need is your crypto key pair, your identity, which is a small file. Then you can re-download everything you said and liked and did from a friend nearby. Nothing will be lost. This happened to someone in the community, and we were pleasantly surprised how well it worked. 11 | ``` 12 | 13 | Pigeon has many of the same goals as Secure Scuttlebutt, including the user's right to Free Listening. Keep this in mind as you navigate the various design decisions and compromises of the protocol. 14 | 15 | # Fundamental Concept: Content Addressing 16 | 17 | Pigeon Protocol relies heavily on content addressing and the SHA-256 hashing algorithm. This means that instead of assigning arbitrary or user-generated names to resources (as is the case with web addresses), names are assigned using the SHA-256 hash algorithm. 18 | 19 | Please watch [this video] if you are unfamiliar with hashing algorithms. 20 | 21 | # Fundamental Concept: Digital Signatures 22 | 23 | Pigeon uses [ED25519](https://ed25519.cr.yp.to/) to generate and verify message signatures. An understanding of digital signing algorithms is assumed. If you need help understanding this concept, please contact us on the mailing list. Due to time constraints, I will defer to existing resources that exist online. 24 | 25 | # Messages: The Basic Building Block 26 | 27 | The most important protocol concept is that of the "message". 28 | In their most simple form, Pigeon protocol messages are just text documents. Text encoding is determined by the client, but UTF-8 is highly encouraged for maximum interoperability. They are human readable and can even be created by hand in a text editor, though most clients will provide better means of authoring messages. 29 | 30 | Below is an example of such a message: 31 | 32 | ``` 33 | author USER.4CZHSZAH8473YPHP1F1DR5ZVCRKEA4Q0BY18NMXYE14NZ0XV2PGG 34 | depth 123 35 | kind weather_report 36 | prev TEXT.E90DY6RABDQ2CJPVQHYQDYH6N7Q46SZKQ0AQ76J6D684HYBRKE4G 37 | 38 | temperature:"22.0C" 39 | webcam_photo:FILE.FV0FJ0YZADY7C5JTTFYPKDBHTZJ5JVVP5TCKP0605WWXYJG4VMRG 40 | weather_reported_by:USER.GGP2VX0ZN41EYXMN81YB0Q4AEKRCVZ5RD1F1PHPY3748HAZSHZC4 41 | 42 | signature JSPJJQJRVBVGV52K2058AR2KFQCWSZ8M8W6Q6PB93R2T3SJ031AYX1X74KCW06HHVQ9Y6NDATGE6NH3W59QY35M58YDQC5WEA1ASW08 43 | ``` 44 | 45 | The specifics of the message format are explained line-by-line [in the message format explanation document](message_format.md). **Please read the message format explanation document before continuing.** 46 | 47 | # Bundles: The Transmission Medium 48 | 49 | A message without a receiver is not very useful. Any peer in a Pigeon cluster has two things it needs to share with its peers: 50 | 51 | * Messages, created by the peer or forwarded on behalf of a "peer of a peer" 52 | * Files, in the form of blobs 53 | 54 | Pigeon sends messages and files to peers through the use of "bundles". Bundles are a file directory arranged in a predictable layout that is specified by the protocol. Peers share bundles with each other through a variety of means. When a peer unpacks a bundle into their local database, the database contents are updated with new information from peers such as messages and blobs (files). 55 | 56 | The directories are transmitted over any medium that supports file transfer (the protocol does not involve itself with such concerns). 57 | 58 | Pigeon follows the philosophy of "offline-first means offline-only". Bundle files could theoretically be: 59 | 60 | * Transmitted over removable media such as USB drives or optical media (CD). 61 | * Compressed using zip compression to increase storage capacity. 62 | * Encrypted using tools like PGP 63 | * Hosted and dynamically updated on a web server for network retrieval. 64 | 65 | The protocol does not place any restrictions on how bundles are handled, transported, compressed or encrypted. It does, however, dictate the internal layout of the bundle. Authors of protocol clients must pay special attention to how bundles are created to ensure security and interoperability between client implementations. 66 | 67 | ## Where Do Messages Go in a Bundle? 68 | 69 | A bundle's [message](message_format.md) payload (as opposed to its blob payload) is contained in a plaintext file at the root bundle directory. The file is named `messages.pgn`. Messages are joined together via carriage return (`\n`). 70 | 71 | Typically, `messages.pgn` will contain messages created by the bundle's author, plus messages created by the author's peers. 72 | 73 | Here is an example of the contents of a `messages.pgn` file: 74 | 75 | ``` 76 | author USER.R68Q26P1GEFC0SNVVQ9S29SWCVVRGCYRV7D96GAN3XVQE3F9AZJ0 77 | depth 0 78 | kind chat_message 79 | prev NONE 80 | 81 | content:"Hello, world!" 82 | 83 | signature 2VMAG4SCX5RHVBKCB1RNZCB0AJN4WN6FEMS7W9FM1CVYSZXMX7CPQFCDPYEKCTGG91Y1YSGY4G5K8XAGQ67HEPDFRMRYQHWQBATAC2R 84 | 85 | author USER.R68Q26P1GEFC0SNVVQ9S29SWCVVRGCYRV7D96GAN3XVQE3F9AZJ0 86 | depth 1 87 | kind chat_message 88 | prev TEXT.6CBA4J3756A5SNM1W1GHNCTT9EG95ZP3ZMAT5Z1EJP7TXMNNVZC0 89 | 90 | content:"Good morning!" 91 | 92 | signature Y34Q47V0BY370RM5KWGRJRN9HFNGJN0C3DEYVB2V2476CW9RN5HD4XD7KMQ6T4T42N36R5P3XX6E3FYEWVZR25AVCF6KQPZHJP6EM10 93 | 94 | author USER.0JZA9F3EQVX3NAG69D7VRYCGRVVCWS92S9QVVNS0CFEG1P62Q86R 95 | depth 2 96 | kind like 97 | prev TEXT.GAP6NJ21K6N75RAEJQ10C2QHFXNRHVPMC54FMGVA77CDJ8AVZQB5 98 | 99 | target:TEXT.5BQZVA8JDC77AVGMF45CMPVHRNXFHQ2C01QJEAR57N6K12JN6PAG 100 | 101 | signature W68NWDQB2WTZ8T1RHP5BZA4N1STVKV16K0PXH10MZVR3XTF8HC7T8646X7SAKP5DFZ5K74QEKE3T2K6V0EST50YQQD7FD2PT0H8J62G 102 | ``` 103 | 104 | The example above is multiple pigeon messages joined together with a carriage return ("\n"). 105 | **Notice that not all messages were created by the same author.** 106 | 107 | A peer can use the file above to update their local database. It is important to note that **a client will always reject a message that it cannot verify**. Below is an example of a refused update: 108 | 109 | * Peer A has verified peer B's messages up to `depth 5`. 110 | * Peer C sends Peer A a new bundle. 111 | * The bundle contains messages authored by peer B, starting at `depth 8`. 112 | * Since Peer A cannot verify message at `depth 8` until it receives `depth 7` and `depth 6`, the messages are rejected by peer A. 113 | 114 | * Clients always reject messages that cannot be verified. For example, if a `messages.pgn` file starts at `depth 6` for a peer `USER.ABC`, and the local client has only verified `USER.ABC`s feed up to `depth 3`, the messages in the bundle will be rejected by the local client because it does not have enough information available to verify the authenticity of the message. 115 | * Messages must be ordered by `depth` for a particular author. 116 | 117 | # Where Do Files Go in a Bundle? 118 | 119 | Files ("blobs") are transferred alongside the `*.pgn` message bundle. 120 | It is the responsibility of the _receiver_ (not the sender) to calculate the multihash of an incoming file. The ensures that files are not misrepresented or tampered with. 121 | 122 | Files added to a blob must follow these naming rules: 123 | 124 | * The [filename extension](https://en.wikipedia.org/wiki/Filename_extension) is located in the same directory as the `messages.pgn` file. 125 | * The filename must follow [8.3 filename conventions](https://en.wikipedia.org/wiki/8.3_filename). 126 | * The file extension must be `.blb`. 127 | * The filename cannot be longer than 8 chars. 128 | -------------------------------------------------------------------------------- /diagram.md: -------------------------------------------------------------------------------- 1 | Edit this diagram at https://mermaid-js.github.io/mermaid-live-editor/#/edit 2 | ```mermaid 3 | classDiagram 4 | None <|-- Example1: None 5 | Example1 <|-- Example2: TEXT.6CF2...A982 6 | 7 | class None{ 8 | empty 9 | } 10 | 11 | class Example1{ 12 | author USER.R68...ZJ0 13 | depth 0 14 | kind my_blog 15 | prev NONE 16 | 17 | current_status:"Another great day. Nice weather, too!" 18 | 19 | signature 2VMAG...TAC2R 20 | } 21 | 22 | class Example2{ 23 | author USER.R68...ZJ0 24 | depth 1 25 | kind like_a_post 26 | prev TEXT.6CB...ZC0 27 | 28 | liked_post_multihash:TEXT.6CB...ZC0 29 | 30 | signature Y34Q47...6EM10 31 | } 32 | ``` 33 | -------------------------------------------------------------------------------- /diagram1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PigeonProtocolConsortium/pigeon-spec/7d20861b90e52de197a669393e62d747043d9530/diagram1.png -------------------------------------------------------------------------------- /faq.md: -------------------------------------------------------------------------------- 1 | # I Have Internet Access. Why Should I Care? 2 | 3 | * [Everything [in the cloud] is Amazing, But Nothing is Ours](https://alexdanco.com/2019/10/26/everything-is-amazing-but-nothing-is-ours/) 4 | * [Encryption is Not Preventing Law Enforcement from Investigating Crime](https://www.alec.org/article/encryption-is-not-preventing-law-enforcement-from-investigating-crime/) 5 | * [‘Nobody’s got to use the Internet’: A GOP lawmaker’s response to concerns about Web privacy](https://www.washingtonpost.com/news/powerpost/wp/2017/04/15/nobodys-got-to-use-the-internet-a-gop-lawmakers-response-to-concerns-about-web-privacy/) 6 | * [How Iran Turned Off the Internet](https://thewire.in/tech/how-iran-turned-off-the-internet) 7 | * [Google goes offline after fibre cables cut](https://www.bbc.com/news/technology-50851420) 8 | * [Building Internet-connected things seems obvious today, but what about when there’s no Internet?](https://back7.co/home/raspberry-pi-recovery-kit) 9 | * [The death of America's net neutrality and how it affects you](https://www.dw.com/en/the-death-of-americas-net-neutrality-and-how-it-affects-you/a-43934099) 10 | * [YouTube and Facebook Are Removing Evidence of Atrocities, Jeopardizing Cases Against War Criminals](https://theintercept.com/2017/11/02/war-crimes-youtube-facebook-syria-rohingya/) 11 | * [Iraq introduces nightly internet curfew](https://netblocks.org/reports/iraq-introduces-nightly-internet-curfew-JAp1DKBd) 12 | * [Building a Low-Tech Internet](https://www.lowtechmagazine.com/2015/10/how-to-build-a-low-tech-internet.html) 13 | * [Inside Cuba's massive, weekly, human-curated sneakernet](https://boingboing.net/2018/05/03/inside-cubas-massive-weekly.html) 14 | * [CollapseOS](https://collapseos.org/) 15 | * [Indian Internet shut down as protests rage against citizenship bill](https://edition.cnn.com/2019/12/12/asia/india-shutdown-citizenship-bill-intl-hnk/index.html) 16 | * [Authoritarian Nations Are Turning the Internet Into a Weapon](https://onezero.medium.com/authoritarian-nations-are-turning-the-internet-into-a-weapon-10119d4e9992) 17 | * [Russian Law Takes Effect that Gives Government Sweeping Power Over Internet](https://www.npr.org/2019/11/01/775366588/russian-law-takes-effect-that-gives-government-sweeping-power-over-internet) 18 | 19 | # When is Pigeon the Wrong Choice? 20 | 21 | * When the application requires true deletion of data, ephemeral data or mutability of previously created data. Pigeon feeds are immutable, append-only and permanently replicated by peers. 22 | * When the application requires realtime interactions or does not benefit from delay tolerance. Support for TCP or UDP sockets will never be added. 23 | * Extremely "chatty" protocols. Pigeon was built with the assumption that data storage is cheap and data transfer is expensive and slow. Use cases with complex handshakes, pinging or timeouts may not be well suited to this protocol. 24 | 25 | # Is This a Blockchain? 26 | 27 | It's different than a block chain despite some similarity. A global blockchain is a singleton, and Pigeon has no singletons. Each Pigeon node maintains their own feed of messages rather than sharing a global feed. When you trust a peer, you agree to replicate their feed. You also replicate the feed of their peers. Unlike a blockchain, there are many feeds (rather than one) and they do not require consensus or coordination to coexist. Additionally, forking of feeds is not supported by Pigeon. 28 | -------------------------------------------------------------------------------- /ideas.md: -------------------------------------------------------------------------------- 1 | # Idea Bin 2 | 3 | This is an ongoing list of ideas. Email me if you have ideas you would like to share. 4 | 5 | * Ephemeral key exchange 6 | * Standardized general purpose message schemas (follow, unfollow, same_as, etc.) 7 | -------------------------------------------------------------------------------- /lipmaa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PigeonProtocolConsortium/pigeon-spec/7d20861b90e52de197a669393e62d747043d9530/lipmaa.png -------------------------------------------------------------------------------- /logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PigeonProtocolConsortium/pigeon-spec/7d20861b90e52de197a669393e62d747043d9530/logo.png -------------------------------------------------------------------------------- /message_format.md: -------------------------------------------------------------------------------- 1 | # Exploring the Pigeon Message Format 2 | 3 | In the test that follows, we will explore a pigeon message line-by-line. 4 | 5 | The example message is shown in its entirety below: 6 | 7 | ``` 8 | author USER.4CZHSZAH8473YPHP1F1DR5ZVCRKEA4Q0BY18NMXYE14NZ0XV2PGG 9 | depth 123 10 | kind weather_report 11 | prev TEXT.E90DY6RABDQ2CJPVQHYQDYH6N7Q46SZKQ0AQ76J6D684HYBRKE4G 12 | 13 | temperature:"22.0C" 14 | webcam_photo:FILE.FV0FJ0YZADY7C5JTTFYPKDBHTZJ5JVVP5TCKP0605WWXYJG4VMRG 15 | weather_reported_by:USER.GGP2VX0ZN41EYXMN81YB0Q4AEKRCVZ5RD1F1PHPY3748HAZSHZC4 16 | 17 | signature JSPJJQJRVBVGV52K2058AR2KFQCWSZ8M8W6Q6PB93R2T3SJ031AYX1X74KCW06HHVQ9Y6NDATGE6NH3W59QY35M58YDQC5WEA1ASW08 18 | ``` 19 | 20 | ### Pigeon Multihashes and Data Types 21 | 22 | Pigeon has 4 data types: 23 | 24 | * Blob multihash: Used to identify arbitrary binary files mentioned in a feed. Blob multihashes start with the word `FILE.`, followed by a Base32 hash (SHA256). 25 | * Message multihash: Used to reference a message in someone's feed. Starts with the word `TEXT.` followed by a Base32 SHA256 checksum. 26 | * User multihash: Used to reference a particular feed. Starts with the word `USER.` followed by a base32 encoded ED25519 public key. 27 | * String: Information shorter than 128 characters can be wrapped in "double quotes" and placed directly into messages. Larger strings must be converted to blobs. The byte length of a character is determined by the client's chosen text encoding scheme. Pigeon has no official text encoding, but UTF-8 is highly encouraged in scenarios where interoperability is important. One character always one character, even if it is multi-byte. Strings cannot contain whitespace characters (encoding dependent). The protocol does not implement character escaping (eg: `"\n"`). Please start a discussion on the mailing list if your application requires this feature. 28 | * None: The word "NONE" is used to indicate the absence of data, similarly to `null` or `nil` seen in some programming languages. 29 | 30 | ### Parts of a Message 31 | 32 | The three parts of a Pigeon message are: 33 | 34 | 1. Header: Data that is used by the _protocol_ 35 | 2. Body: Data that is used by the _user or application_ 36 | 3. Footer: Cryptographic signature to prevent tampering or forgery. 37 | 38 | **The parts of a message must follow the order specified in this document.** The order of headers is not user definable. The fact that headers are alphabetical is a coincidence and future versions of the protocol might not be alphabetized. 39 | 40 | ### Parts of a Header 41 | 42 | A header is the first part of a message and contains 5 subsections. Each of these sections will be explained in further detail in the sections that follow: 43 | 44 | 1. `author`: A user multihash indicating the author of the message. The public key will be used to verify the signature (found in the footer) 45 | 1. `depth`: The order number of the current message. Since feeds are append-only, this number will only increase. The `depth` field ensures unique message signatures, even for successive duplicate messages. 46 | 1. `kind`: Used by applications to determine the intent or "shape" of a message. 47 | 1. `prev`: The multihash of the previous message in the feed. Required for verifying the authenticity of a feed. 48 | 49 | 50 | **Header entries must follow the order specified above.** 51 | 52 | ### Line 1: `Author` 53 | 54 | EXAMPLE: 55 | 56 | ``` 57 | author USER.4CZHSZAH8473YPHP1F1DR5ZVCRKEA4Q0BY18NMXYE14NZ0XV2PGG 58 | ``` 59 | 60 | The first line of a Pigeon message header is the `author` entry. 61 | 62 | Every Pigeon database has an "identity". An identity is an ED25519 key pair that prevents tampering by parties other than the database owner. In the example above, the identity multihash was `USER.4CZHSZAH8473YPHP1F1DR5ZVCRKEA4Q0BY18NMXYE14NZ0XV2PGG`. 63 | 64 | The steps to generate a valid identity are: 65 | 66 | 1. Perform [Crockford Base32 encoding](https://www.crockford.com/base32.html) on an ED25519 public key. 67 | 2. Concatenate the characters `USER.` to the beginning of the string from step 1. 68 | 69 | ### Line 2: `Depth` 70 | 71 | EXAMPLE: 72 | 73 | ``` 74 | depth 3 75 | ``` 76 | 77 | Pigeon messages exist in a linear sequence which only moves forward and never "forks", skips or moves backward. 78 | Every message has a `depth` field to indicate its "place in line". 79 | Because every message has an ever-increasing integer that never duplicates, every message in a Pigeon feed will have a unique hash. This is true even if messages have identical body content. 80 | 81 | The `depth` count always starts at 0 and icreases by 1 every time a new message is added to the feeds. Feeds that assign `depth` values in a non-sequential order are invalid. Eg: No gaps, no skipping, etc.. 82 | 83 | ### Line 3: `Kind` 84 | 85 | EXAMPLE: 86 | 87 | ``` 88 | kind weather_report 89 | ``` 90 | 91 | The second line of the header is the `kind` entry. This entry is user definable. The `kind` entry is used as a means of signalling intent to applications that will consume the message. 92 | 93 | It must meet the following criteria: 94 | 95 | * Must be 1-90 characters in length 96 | * Cannot contain whitespace or control characters 97 | * May contain any of the following characters: 98 | * alphanumeric characters 99 | * dashes (`-`), underscores (`_`) and dots (`.`) 100 | 101 | **For the first message of a feed, this value is set to `NONE`.** 102 | 103 | Message multihashes are calculated as follows: 104 | 105 | 1. Create a [Crockford base 32](https://www.crockford.com/base32.html) sha256 hash of the message's content. 106 | 2. Append the string `TEXT.` to the front of the checksum created in step 1. 107 | 108 | ### Line 4: `Prev` 109 | 110 | EXAMPLE: 111 | 112 | ``` 113 | prev TEXT.E90DY6RABDQ2CJPVQHYQDYH6N7Q46SZKQ0AQ76J6D684HYBRKE4G 114 | ``` 115 | 116 | A Pigeon message feed is a unidirectional chain of documents where the newest document points back to the document that came before it in the chain ([example diagram](diagram1.png)). 117 | 118 | To create this chain, a Pigeon message uses the `prev` field. The `prev` field contains a message multihash. In this case, the multihash is `TEXT.E90DY6RABDQ2CJPVQHYQDYH6N7Q46SZKQ0AQ76J6D684HYBRKE4G`. 119 | 120 | Messages are content addressed. This is in contrast to protocols such as HTTP which use names to identify resources. Because Pigeon messages are addressed by content rather than by name, changing a message's content, even by just one character, has the effect of completely changing the message's multihash. 121 | 122 | 123 | ### Line 5: Body Start (Empty Line) 124 | 125 | Once all headers are added, a client must place an empty line (`\n`) after the header. 126 | The empty line signifies the start of the message body. 127 | 128 | Some notes about body entries: 129 | 130 | * The body of a message starts and ends with an empty line (`\n`). 131 | * Every body entry is a key value pair. Keys and values are separated by a `:` character (no spaces). 132 | * A message may not exceed 128 key/value pairs. 133 | * A key must be 1-90 characters in length. 134 | * A key cannot contain whitespace or control characters 135 | * A key only contains the following characters (`[A-Z|a-z|\-|\_|\.|0-9]{1,90}`): 136 | * alphanumeric characters (a-z, A-Z, 0-9) 137 | * dots (`.`) 138 | * dashes (`-`) 139 | * underscores (`_`) 140 | * A value may be a: 141 | * A string (128 characters or less) 142 | * A multihash referencing an identity (`USER.`), a message (`TEXT.`) or a blob (`FILE.`). 143 | 144 | ### Lines 6: Example Entry Containing a String 145 | 146 | EXAMPLE: 147 | 148 | ``` 149 | temperature:"22.0C" 150 | ``` 151 | 152 | Body entries are defined by the user and contain key/value pairs of application-specific data. 153 | When a key/value pair represents something other than an identity, blob or message ID, a string is used. 154 | Strings can be used for any type of data that does not fit into the other three categories. 155 | Strings must be less than or equal to 128 characters in length. 156 | The example above is the most simple kind of body entry. It specifies an arbitrary string representing the current temperature. 157 | 158 | The protocol does not dictate the format of strings (ie: there is no 1st class JSON support). The meaning and formatting of a string is the responsibility of the application. 159 | 160 | ### Lines 7: Entry Referencing a Blob 161 | 162 | EXAMPLE: 163 | 164 | ``` 165 | webcam_photo:FILE.FV0FJ0YZADY7C5JTTFYPKDBHTZJ5JVVP5TCKP0605WWXYJG4VMRG 166 | ``` 167 | 168 | Applications may attach files to messages in the form of blobs. Blobs are referenced using a blob multihash. 169 | 170 | A blob is referenced in a message's key or value. A client will include a blob's content in a "bundle" (explained later). This ensures that a feed's peers get a copy of the file that a message references. 171 | 172 | ### Lines 8: Entry Referencing a Peer's Identity 173 | 174 | EXAMPLE: 175 | 176 | ``` 177 | weather_reported_by:USER.GGP2VX0ZN41EYXMN81YB0Q4AEKRCVZ5RD1F1PHPY3748HAZSHZC4 178 | ``` 179 | 180 | A message may reference other identities (or its own identity) by using an identity multihash either in the key or value portion of the entry. 181 | 182 | This is analogous to "social tagging" seen in many social networks. 183 | 184 | ### Lines 9: Empty Carriage Return (Footer Start) 185 | 186 | The last part of a message is the footer. Like a message body, a message footer starts and ends with an empty line. 187 | The footer is essential for ensuring the tamper resistant properties of a Pigeon message. 188 | 189 | ### Lines 10: Signature Line 190 | 191 | EXAMPLE: 192 | 193 | ``` 194 | signature JSPJJQJRVBVGV52K2058AR2KFQCWSZ8M8W6Q6PB93R2T3SJ031AYX1X74KCW06HHVQ9Y6NDATGE6NH3W59QY35M58YDQC5WEA1ASW08 195 | ``` 196 | 197 | A signature starts with the word `signature` followed by a space. 198 | After that, the body and header (including the trailing `\n`) are signed using the author's ED25519 key. 199 | The signature is encoded with Crockford base 32. 200 | An empty carriage return is added after the signature line. 201 | -------------------------------------------------------------------------------- /roadmap.md: -------------------------------------------------------------------------------- 1 | 2 | # Roadmap 3 | 4 | ## Phase I: Build a Working Client 5 | 6 | **Completed April 2020** 7 | 8 | This is the brainstorming phase where the initial proof-of-concept clients will be written. The first protocol client will be slow and may not be suitable for embedded use within a larger application. 9 | 10 | This phase is complete when there is at least one functioning client implementation. 11 | 12 | ## [Current] Phase II: Build a Working Application 13 | 14 | Using the protocol client from phase I, build an application which uses Pigeon for simulated real-world conditions. This phase will allow for discovery of problems with the draft specification and the first client implementations. 15 | 16 | Please see the "What's Possible" section for a list of applications that may be published. 17 | 18 | This phase is complete when there are at least two applications (rather than libs or clients) that utilize the protocol. 19 | 20 | ## Phase III: Client Improvements 21 | 22 | Once a gauntlet of applications have been built and outstanding design problems have been addressed, re-write existing client libraries. Unlike the client built in Phase I, the clients built in this phase will have a focus on: 23 | 24 | * Production-scale performance 25 | * Stability 26 | * Portability to targets like WASM, embedded systems, Windows, etc.. 27 | * Ability to be embedded into existing applications. 28 | 29 | This phase is complete when: 30 | * There is a client library that is written in an embeddable language (C, Rust, etc..). 31 | * There is a client library that can performantly serve a mesh of more than 15 peers in a real-world application. 32 | 33 | Nice-to-haves for this phase: see the implementation of a WASM and bare metal (embedded) client. 34 | 35 | ## Phase IV: Finalize v1 Spec 36 | 37 | Once a production-grade client exists, the focus will then become documentation. Using the knowledge gained from phases I-III, we will re-write all documentation, possibly using Gitbook or similar services. 38 | 39 | Version 1 of the protocol will be considered complete at this phase and the protocol will be considered "ready for production use". 40 | 41 | This phase is complete when the "Pigeon Protocol Handbook" is authored. The handbook will be a guide less than 100 pages long, that can be read by a developer from start to finish (as opposed to being referenced) to help them start writing Pigeon applications. 42 | 43 | ## Phase V: Stabilize, Maintain, Proliferate 44 | 45 | With a finalized spec and a portable client library, the next goal is to promote the product to as many developers as possible and continue to author software that is well suited to the protocol. 46 | 47 | This phase will be considered complete when there are three production-scale apps using the libraries authored. By this point, we've hopefully made a difference and helped people regain control of their data and find a new alternative to the current status-quo of "online only" computer applications. 48 | 49 | After that, I might rename the project so that we are not tied to the legacy baggage of the prototype phase. It might be fun to apply to a grant for continued maintenance (or just lock down the feature set- it's too early to say). 50 | -------------------------------------------------------------------------------- /sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PigeonProtocolConsortium/pigeon-spec/7d20861b90e52de197a669393e62d747043d9530/sync.png --------------------------------------------------------------------------------