├── 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 | 
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 | 
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 | 
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
--------------------------------------------------------------------------------