From da25e38272d6b6544a01b241469c978f88dba878 Mon Sep 17 00:00:00 2001 From: Marvin Kweyu Date: Tue, 14 Jul 2026 12:06:17 +0300 Subject: [PATCH 1/4] docs: include license --- CLAUDE.md => .claude/CLAUDE.md | 0 LICENSE.md | 661 +++++++++++++++++++++++++++++++++ 2 files changed, 661 insertions(+) rename CLAUDE.md => .claude/CLAUDE.md (100%) create mode 100644 LICENSE.md diff --git a/CLAUDE.md b/.claude/CLAUDE.md similarity index 100% rename from CLAUDE.md rename to .claude/CLAUDE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..be3f7b2 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. From 427edab91162099760a0626470b81277ca8c298e Mon Sep 17 00:00:00 2001 From: Marvin Kweyu Date: Tue, 14 Jul 2026 12:54:07 +0300 Subject: [PATCH 2/4] docs: update readme --- .env.docker => .env.docker.example | 1 - .gitignore | 2 + CONTRIBUTING.md | 327 +++++++++++++++++++++++++++++ README.md | 86 +++++--- images/preview.png | Bin 0 -> 71066 bytes 5 files changed, 391 insertions(+), 25 deletions(-) rename .env.docker => .env.docker.example (85%) create mode 100644 CONTRIBUTING.md create mode 100644 images/preview.png diff --git a/.env.docker b/.env.docker.example similarity index 85% rename from .env.docker rename to .env.docker.example index 93d6396..61ae940 100644 --- a/.env.docker +++ b/.env.docker.example @@ -1,4 +1,3 @@ -# Local development defaults (safe to commit-free; used by docker-compose.local.yml) POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_DB=foundry diff --git a/.gitignore b/.gitignore index 254c1d6..db9a120 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,5 @@ vitest.config.*.timestamp* docs apps/api/src/generated uploads +.env +.env.docker diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4a63161 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,327 @@ +# Contributing to Foundry + +Thanks for considering a contribution. Foundry is built by Tillertech to +solve a problem I hit myself running a consultancy, and it stays useful +only because the people using it push it forward. This document covers +what you need to know before opening an issue or a pull request - the +license, the feature-line policy, and how contributions actually get +reviewed. + +Read the sections that apply to what you're planning to do. If you're +opening an issue, the "Reporting bugs and requesting features" section +is enough. If you're opening a PR, read the license and CLA section +first. + +--- + +## License + +Foundry Community is licensed under **AGPL-3.0-or-later** (AGPLv3). + +The full license text is in [`LICENSE`](./LICENSE). The short version: + +- You can run Foundry for your own business, modify it, and deploy it on + your own infrastructure - without restriction, without notifying us, + without paying anything. +- You can fork it, extend it, and distribute your modifications, as long + as those modifications are also licensed under AGPLv3. +- If you modify Foundry and offer the modified version as a network + service to others (for example, hosting a modified Foundry as a SaaS), + AGPL requires you to publish your modifications under the same + license. +- For internal use by your own business - even by a large team - + AGPL imposes no obligations you would notice in day-to-day operation. + +If you are unsure how AGPL applies to your situation, ask before +building on it. We would rather answer a question up front than have a +contributor discover the constraint later. + +Tillertech separately maintains proprietary code (`foundry-ee` and +`foundry-cloud`) that is not part of this repository and is not covered +by AGPLv3. That code is not accepted as a contribution to this project. +This repository is Community only. + +--- + +## What belongs in Community vs. Cloud + +This is the question that comes up most often before someone starts +building, and it saves time to answer it up front. + +**The test.** If a feature is part of the client-to-cash lifecycle +(Clients - Quotes - Projects - Invoices - Payments - Documents), it +belongs in Community. No exceptions, no future re-litigation. If a +feature is about administration, compliance, multi-party access, or +operating at scale, it belongs in the commercial Cloud offering and +should not be built in this repository. + +**Community owns:** + +- Clients, Quotes, Projects, Invoices, Payments, Expenses, Documents +- Basic reporting and dashboards +- Recurring invoicing and retainer billing +- Time tracking against projects +- Multi-currency invoicing with VAT/GST handling +- Document branding on outbound documents (logo, name, colors, business + details) +- Realtime in-app notifications +- REST API - read/write access to your own data +- Plugin architecture and extension hooks - third parties can build and + distribute plugins for Community +- CSV/JSON import and export of all data +- E-signature acceptance on quotes +- Basic client-facing portal (view and download quotes and invoices via + tokenized links) +- Online payment collection on invoices (Stripe, direct) + +**Cloud owns (not this repository):** + +- SSO (SAML/OIDC) and SCIM provisioning +- RBAC beyond a basic owner/viewer split +- Immutable audit log +- Multi-workspace management +- Advanced template designer (build layouts from scratch) +- Full interactive client portal with quote acceptance workflow, + document exchange, and messaging +- Automation engine - conditional multi-step workflow rules +- Outbound webhooks and API keys for third-party integrations at scale +- White-label (hide that Foundry is the vendor) +- Approval workflows +- Managed hosting, backups, monitoring +- Priority support and SLA + +**The grey-area rule.** When a feature is not obviously one or the +other: does it serve one person running their own business, or does it +serve coordinating across a team, multiple parties, or a regulatory +requirement? First case belongs in Community. Second case belongs in +Cloud and should not be contributed here. + +**The standing promise.** The client-to-cash lifecycle stays free, +unlimited, and actively developed in Community - permanently. A new +lifecycle feature never triggers a "which tier does this go in" +negotiation. Community does not get worse to sell Cloud. + +If you have a feature idea and are not sure which side it falls on, +open a discussion issue before you start building. Getting it wrong +after a week of work is the outcome we most want to help you avoid. + +--- + +## Reporting bugs + +Before filing: + +- Search existing issues to check whether it has already been reported. +- Confirm the bug is in the latest release; if you are running an older + version, upgrade first and see whether it reproduces. +- If it involves a specific data condition, try to reproduce it from a + clean install. + +When you file, include: + +- Foundry version (`docker inspect` on the image tag is fine). +- Deployment context - Docker Compose on a VPS, on-prem, air-gapped, + etc. +- Postgres and Redis versions if you have customized them. +- What you did, what you expected, what actually happened. +- Relevant logs (`docker compose logs api`) with sensitive information + scrubbed. +- If the bug is UI-related, a screenshot or a short screen recording. + +Do not include real client data or invoice contents in bug reports. +Sanitized examples are always fine. + +--- + +## Requesting features + +Feature requests are welcome. Two things to check first: + +1. Read the "What belongs in Community vs. Cloud" section above. If + what you are asking for is a Cloud feature (SSO, audit log, RBAC, + etc.), the answer is "not in this repository" - but tell us anyway, + because that is exactly the signal that helps decide when to build + a self-hosted Enterprise SKU. +2. Search existing feature request issues. If one exists, add your use + case rather than opening a duplicate. Real use cases from real + businesses are what actually move a feature up the priority list. + +When requesting a feature, describe: + +- What you are trying to accomplish (the actual workflow, not the + feature name). +- What you currently do instead, and where it breaks down. +- Why the existing feature set does not solve it. + +Feature requests without a workflow context are hard to prioritize. +"Add X because Y competitor has it" is not a use case; "I need to bill +retainers across three currencies for a client that flips between +project-based and hourly, and here is how I currently do it" is. + +--- + +## Security disclosure + +If you find a security vulnerability, **do not open a public issue.** + +Email `hello@tillertech.io` with: + +- A description of the vulnerability. +- Reproduction steps. +- The affected version(s) if you can identify them. +- Your name and how you would like to be credited (or "anonymous"). + +We will acknowledge within 7 days. We do not currently offer a bug +bounty program, but confirmed reports get credit in the release notes +for the fix, and Tillertech reserves the right to send you something as +a thank-you. + +Please give us reasonable time to ship a fix before disclosing +publicly. If a fix is not shipping in a timeframe you consider +reasonable, tell us that directly - we would rather negotiate a +disclosure timeline than have you publish out of frustration. + +--- + +## Development setup + +You will need: + +- Node.js 20 LTS or newer +- pnpm 9 or newer +- Docker and Docker Compose (for Postgres, Redis, and optional local S3) +- A Postgres 15+ instance (Docker Compose brings one up locally) + +Setup: + +```bash +git clone https://github.com/tillertech/foundry.git +cd foundry +pnpm install +cp .env.example .env +docker compose -f docker-compose.dev.yml up -d +pnpm nx run api:migrate +pnpm nx run-many -t serve +``` + +The client runs on `http://localhost:4200` and the API on +`http://localhost:3000`. + +If any of those commands fail on a clean clone, that itself is a +reportable bug - first-run experience matters more than most bugs, and +we want to hear about it. + +--- + +## Pull request workflow + +**Before you write code:** + +- For a bug fix under ~50 lines, just open the PR - no issue needed. +- For anything larger, open an issue first and get a signal from a + maintainer that the direction is welcome. This is not a formality; + it saves you from writing a week of code that gets closed for a + reason that could have been discussed in ten minutes. +- If you are adding a dependency, mention it in the issue. New + dependencies are a real cost and often not the right call. +- If your change touches the schema, mention it in the issue. Schema + changes are additive-only in Foundry and go through more careful + review. + +**When you open the PR:** + +- Reference the issue it addresses (`Closes #123` or `Refs #123`). +- Keep the PR focused - one logical change per PR. Two unrelated fixes + should be two PRs. +- Include a short "what changed and why" in the description. Not a + novel; a paragraph. +- If it is a UI change, include a screenshot before/after. +- Make sure the CI passes locally before you push + (`pnpm nx run-many -t lint test`). + +**What we look for in review:** + +- Does it match the module boundary rules? Core code cannot import + from `libs/ee/*`. The lint rule enforces this, but reviewers will + also check. +- Does it follow existing patterns in the codebase? Consistency is + worth more than local elegance. +- Is it tested? Not every change needs a test, but changes to the + quote/invoice/payment logic almost always do. +- Is the commit history clean? Squash noisy WIP commits before we + merge. + +**Review timelines:** aim to acknowledge within a week, first +substantive review within two weeks. If a PR sits without a response +for longer than that, ping the issue - it has slipped through, not +been ignored. + +--- + +## Code style + +- TypeScript strict mode is on. Do not relax it locally. +- ESLint and Prettier configs live at the root and are what we run in + CI. Do not fight them. +- Use existing Nx generators for new libs, controllers, and modules - + do not hand-create the folders. This keeps tags and boundary rules + correct from the start. +- Prefer smaller, well-named files over large ones. Public exports + from each lib go through the `index.ts` barrel. + +--- + +## What we do not accept + +Being direct so nobody wastes time: + +- Contributions to Cloud/Enterprise features (see the boundary section + above). Even good code for an SSO integration or an audit log is out + of scope for this repository. If you want to build one of these, + reach out and we can discuss whether a self-hosted Enterprise SKU is + something we should be working on together. +- Contributions that reshape the schema breakingly. All schema changes + are additive. Migrations remove tables only through a deprecation + cycle that takes at least one major release. +- Contributions that add telemetry or "phone home" behavior of any + kind. Foundry runs offline by design; this is not negotiable. +- Contributions that introduce dependencies without a real + justification. Every added dependency is future maintenance for + everyone. +- Drive-by rewrites of significant subsystems without a prior + discussion issue. Not because we don't want the improvement, but + because a rewrite that lands without prior conversation almost + always misses context that a five-minute discussion would surface. + +--- + +## A note on tone + +Public issues, discussions, and PR reviews all follow the same rule: +be direct, be specific, be kind. Direct honesty is more useful than +padded feedback; specifics are more useful than gestures; kindness is +what makes the first two land. + +Push back on decisions you think are wrong - including decisions I +made. If you think a feature is in the wrong tier, if you think the +architecture is off, if you think the roadmap is missing something +important, say so. This project gets better when someone catches a +contradiction I missed. + +That goes in both directions. If a maintainer pushes back on your PR, +it is about the code, not you. If it feels otherwise, tell us - +directly - and we will fix it. + +--- + +## Questions + +- General discussion: GitHub Discussions on this repo. +- Bug reports: GitHub Issues on this repo. +- Anything about Cloud, licensing, or commercial arrangements: + `hello@tillertech.io`. + +Thanks for reading this far. If you are about to open your first issue +or PR, welcome - Foundry is more useful because you are here. + +- Marvin Kweyu, Tillertech diff --git a/README.md b/README.md index 7cd17f4..187554f 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,52 @@ -# Foundry -> The modern workspace for independent consultants +

+

Foundry

+

The modern workspace for independent consultants

+

+ + +![Foundry](./images/preview.png) ## Project Overview -This repository demonstrates a production-ready Angular monorepo with: +Foundry is the solution to consultancy management in the service industry. -- **2 Applications** +### Local Development - - `client` - Angular e-commerce application with product listings and detail views - - `api` - Backend API with Docker support serving product data +#### Docker(Recommended) -- **6 Libraries** +**Basic requirements** +- Docker +- Docker Compose - - `@org/feature-products` - Product listing feature (Angular) - - `@org/feature-product-detail` - Product detail feature (Angular) - - `@org/data` - Data access layer for client features - - `@org/shared-ui` - Shared UI components - - `@org/models` - Shared data models - - `@org/products` - API product service library -- **E2E Testing** - - `client-e2e` - Playwright tests for the client application +```sh +cp .env.docker.example .env.docker +docker compose -f docker-compose.local.yml up +``` + +If you have [just](https://just.systems/man/en/) installed: + +```sh +cp .env.docker.example .env.docker +just develop +``` + + +The complete set of commands can be found with: + +```sh +just +``` + + +#### Manual(Docs WIP) + +The manual setup process is (WIP) -## Quick Start ```bash -# Clone the repository -git clone -cd -# Install dependencies -# (Note: You may need --legacy-peer-deps) -npm install +npm install --legacy-peer-deps # Serve the Angular client application (this will simultaneously serve the API backend) npx nx run client:serve @@ -58,10 +73,33 @@ npx nx run-many -t lint test build e2e --parallel=3 # Visualize the project graph npx nx graph ``` +---- + + + +The client runs on `http://localhost:4200` and the API on `http://localhost:3000`. + +This repository demonstrates a production-ready Angular monorepo with: + + +## Notes on Architecture(WIP) +- **2 Applications** + + - `client` - Angular e-commerce application with product listings and detail views + - `api` - Backend API with Docker support serving product data + +- **6 Libraries** + + - `@org/feature-products` - Product listing feature (Angular) + - `@org/feature-product-detail` - Product detail feature (Angular) + - `@org/data` - Data access layer for client features + - `@org/shared-ui` - Shared UI components + - `@org/models` - Shared data models + - `@org/products` - API product service library -## Featured Nx Capabilities +- **E2E Testing** + - `client-e2e` - Playwright tests for the client application -This repository showcases several powerful Nx features: ### 1. Module Boundaries diff --git a/images/preview.png b/images/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..2d37bb4a1e7e1650a0cac29b29aee7d645b49fa4 GIT binary patch literal 71066 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 Date: Tue, 14 Jul 2026 13:01:17 +0300 Subject: [PATCH 3/4] docs: update setup guide --- README.md | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 187554f..5c85e9d 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,30 @@ Foundry is the solution to consultancy management in the service industry. -### Local Development -#### Docker(Recommended) +- [Project Overview](#project-overview) +- [Local Development](#local-development) + - [Docker(Recommended)](#dockerrecommended) + - [Manual(Docs WIP)](#manualdocs-wip) +- [Notes on Architecture(WIP)](#notes-on-architecturewip) + - [1. Module Boundaries](#1--module-boundaries) + - [2. Docker Integration](#2-docker-integration) + - [3. Playwright E2E Testing](#3-playwright-e2e-testing) + - [4. Vitest for Unit Testing](#4-vitest-for-unit-testing) +- [Project Structure(WIP)](#project-structurewip) +- [Understanding Tags](#understanding-tags) +- [Useful Commands](#useful-commands) +- [Adding New Features](#adding-new-features) + - [Generate a new Angular application:](#generate-a-new-angular-application) + - [Generate a new Angular library:](#generate-a-new-angular-library) + - [Generate a new Angular component:](#generate-a-new-angular-component) + - [Generate a new API library:](#generate-a-new-api-library) + + + +## Local Development + +### Docker(Recommended) **Basic requirements** - Docker @@ -39,7 +60,7 @@ just ``` -#### Manual(Docs WIP) +### Manual(Docs WIP) The manual setup process is (WIP) @@ -157,7 +178,7 @@ npx nx run client-e2e:e2e-ci [Learn more about E2E testing →](https://nx.dev/docs/technologies/test-tools/playwright) -### 4. ⚡ Vitest for Unit Testing +### 4. Vitest for Unit Testing Fast unit testing with Vite for Angular libraries: @@ -169,27 +190,7 @@ npx nx run data:test npx nx run-many -t test ``` -[Learn more about Vite testing →](https://nx.dev/docs/technologies/build-tools/vite) - -### 5. Self-Healing CI - -The CI pipeline includes `nx fix-ci` which automatically identifies and suggests fixes for common issues: - -```bash -# In CI, this command provides automated fixes -npx nx fix-ci -``` - -This feature helps maintain a healthy CI pipeline by automatically detecting and suggesting solutions for: - -- Missing dependencies -- Incorrect task configurations -- Cache invalidation issues -- Common build failures - -[Learn more about self-healing CI →](https://nx.dev/docs/features/ci-features/self-healing-ci) - -## Project Structure +## Project Structure(WIP) ``` ├── apps/ From fed7be0023e53927cc90fc14b690e5a9cfbd1414 Mon Sep 17 00:00:00 2001 From: Marvin Kweyu Date: Tue, 14 Jul 2026 13:03:21 +0300 Subject: [PATCH 4/4] feat: update ignore file --- .gitignore | 1 + docker-compose.staging.yml | 54 -------------------------------------- 2 files changed, 1 insertion(+), 54 deletions(-) delete mode 100644 docker-compose.staging.yml diff --git a/.gitignore b/.gitignore index db9a120..6a663bd 100644 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,7 @@ vitest.config.*.timestamp* .nx/migrate-runs docs apps/api/src/generated +*staging.yml uploads .env .env.docker diff --git a/docker-compose.staging.yml b/docker-compose.staging.yml deleted file mode 100644 index f2decbe..0000000 --- a/docker-compose.staging.yml +++ /dev/null @@ -1,54 +0,0 @@ -services: - redis: - container_name: foundrycache - image: redis - volumes: - - redis:/data - restart: always - networks: - - foundry - - foundryapi: - container_name: foundryapi - build: - context: . - dockerfile: Dockerfile.api.production - environment: - NODE_ENV: production - REDIS_HOST: redis - UPLOADS_DIR: /app/uploads - env_file: - - ./.env - ports: - - 3007:3000 - volumes: - - uploads:/app/uploads - depends_on: - redis: - condition: service_started - restart: always - networks: - - foundry - - foundryclient: - container_name: foundryclient - build: - context: . - dockerfile: Dockerfile.client.production - ports: - - 8083:80 - depends_on: - foundryapi: - condition: service_started - restart: always - networks: - - foundry - -volumes: - postgres_data: - redis: - uploads: - -networks: - foundry: - name: foundry