remove peach-meta
This commit is contained in:
parent
92a004d630
commit
915a008be1
|
@ -1,4 +0,0 @@
|
|||
*.png filter=lfs diff=lfs merge=lfs -text
|
||||
*.jpg filter=lfs diff=lfs merge=lfs -text
|
||||
*.webm filter=lfs diff=lfs merge=lfs -text
|
||||
*.svg filter=lfs diff=lfs merge=lfs -text
|
|
@ -1,146 +0,0 @@
|
|||
# ButtCloud :partly_sunny: :rainbow:
|
||||
|
||||
_an April 2018 #ssbc-grants proposal_
|
||||
|
||||
i'd like to work on better pub infrastructure and a hosted pub-as-a-service product.
|
||||
|
||||
## team
|
||||
|
||||
me! :smiley_cat:
|
||||
|
||||
## goals
|
||||
|
||||
- we build an [open source business](http://blog.dinosaur.is/workers-of-open-source-unite/) on Scuttlebutt!
|
||||
- a pub is [your personal cloud device](%Gwqklkj0b2CBT5tPiz5170NWsPp3xiuLbOImEaG/e+4=.sha256) that is always available and publicly accessible
|
||||
- a pub should be affordable (start pricing at ~$7/month per pub, try to get to ~$1/month per pub)
|
||||
- we support open source infrastructure providers, like [OVH](https://www.ovh.com/world/public-cloud/) and [Catalyst](http://catalyst.net.nz/catalyst-cloud)
|
||||
- the infrastructure code should easy for others to contribute and maintain
|
||||
|
||||
## the story so far
|
||||
|
||||
pubs are important ([1](%f6ZRXO2t0rwUw/lq5FpWCHtuHc9406Q37TB+lF9bUbc=.sha256), [2](https://writtenby.adriengiboire.com/2018/03/14/my-first-week-experience-with-scuttlebutt-and-patchwork/), [3](https://twitter.com/nicolasini/status/974364249219727360)), but [public pubs are a stop-gap we've used for too long](%MZCHPVkh8sNhTsevWgSVXNlL6dYgSnzBvB3hJcJZ/7k=.sha256), we need [private pubs for everyone](%Gwqklkj0b2CBT5tPiz5170NWsPp3xiuLbOImEaG/e+4=.sha256)!
|
||||
|
||||
[over the holidays](%1TVZigDql9VAQaZZVX/QegKan18urBuXQikOWE1uTMk=.sha256), i got maybe 80% of the way towards automated Scuttlebutt pub infrastructure using [Salt Stack](https://docs.saltstack.com/), hosted on [Open Stack](https://docs.openstack.org) using [OVH public cloud](https://www.ovh.com/world/public-cloud/). i've also been able to achieve _mostly_ reliable pubs using an [`ssb-pub`](https://github.com/ahdinosaur/ssb-pub) Docker image.
|
||||
|
||||
i want to throw away all the [Salt Stack](https://docs.saltstack.com/) work i did and start over with [Docker Swarm](https://docs.docker.com/engine/swarm/).
|
||||
|
||||
i expect this will take [longer than a month of full-time work to complete](%9ZzHJ2F0MHncqLLInC47Tp/OuHEUcHyRfWYierUpUKc=.sha256).
|
||||
|
||||
## sub-projects
|
||||
|
||||
there are three main sub-projects:
|
||||
|
||||
- provider service
|
||||
- hub swarm
|
||||
- pub service
|
||||
|
||||
## architecture
|
||||
|
||||
- provider service
|
||||
- web app
|
||||
- join
|
||||
- land
|
||||
- sign in
|
||||
- create pub
|
||||
- pay for pub
|
||||
- start pub service
|
||||
- monitor
|
||||
- land
|
||||
- sign in
|
||||
- view pub
|
||||
- see stats
|
||||
- command
|
||||
- land
|
||||
- sign in
|
||||
- view pub
|
||||
- run command
|
||||
- web api
|
||||
- users
|
||||
- id
|
||||
- name
|
||||
- email
|
||||
- pub
|
||||
- bots
|
||||
- id
|
||||
- userId
|
||||
- name
|
||||
- status (up, down, none)
|
||||
- stats
|
||||
- stream Docker stats
|
||||
- commands
|
||||
- relay commands to pub services
|
||||
- orchestrator
|
||||
- on schedule, check what pubs are up
|
||||
- have 1 pub per 1 GB memory, 1 hub per 15 GB memory
|
||||
- queue worker jobs to ensure correct swarm
|
||||
- payment
|
||||
- products
|
||||
- plans
|
||||
- customers
|
||||
- subscriptions
|
||||
- swarm worker
|
||||
- manage hub [machines](https://docs.docker.com/machine/drivers/openstack/)
|
||||
- create hub
|
||||
- destroy hub
|
||||
- manage pub [services](https://docs.docker.com/engine/swarm/swarm-tutorial/deploy-service/)
|
||||
- ensure pub service is up
|
||||
- ensure pub service is down
|
||||
- mailer worker
|
||||
- pub service
|
||||
|
||||
## stack
|
||||
|
||||
- provider service
|
||||
- web api
|
||||
- [@feathersjs/socketio](https://github.com/feathersjs/socketio)
|
||||
- [@feathersjs/authentication](https://github.com/feathersjs/authentication)
|
||||
- [@feathersjs/authentication-jwt](https://github.com/feathersjs/authentication-jwt)
|
||||
- [feathers-stripe](https://github.com/feathersjs-ecosystem/feathers-stripe)
|
||||
- [node-resque](https://github.com/taskrabbit/node-resque)
|
||||
- [docker-remote-api](https://github.com/mafintosh/docker-remote-api)
|
||||
- web app
|
||||
- [next.js](https://github.com/zeit/next.js/)
|
||||
- [ramda](http://ramdajs.com/docs/)
|
||||
- [@feathersjs/socketio-client](https://github.com/feathersjs/socketio-client)
|
||||
- [@feathersjs/authentication-client](https://github.com/feathersjs/authentication-client)
|
||||
- [react](https://facebook.github.io/react)
|
||||
- [react-hyperscript](https://github.com/mlmorg/react-hyperscript)
|
||||
- [recompose](https://github.com/acdlite/recompose)
|
||||
- [fela](https://github.com/rofrischmann/fela)
|
||||
- [material-ui](https://material-ui.com/)
|
||||
- [react-stripe-elements](https://github.com/stripe/react-stripe-elements)
|
||||
- swarm worker
|
||||
- [node-resque](https://github.com/taskrabbit/node-resque)
|
||||
- [docker-remote-api](https://github.com/mafintosh/docker-remote-api)
|
||||
- mailer worker
|
||||
- [node-resque](https://github.com/taskrabbit/node-resque)
|
||||
- [nodemailer](https://github.com/nodemailer/nodemailer)
|
||||
- third-party: [sendgrid](https://sendgrid.com/)
|
||||
- dev tool: [maildev](https://github.com/djfarrelly/maildev)
|
||||
- [pub service](http://github.com/ahdinosaur/ssb-pub)
|
||||
- [scuttlebot](https://github.com/ssbc/scuttlebot)
|
||||
- [ssb-viewer](%MeCTQrz9uszf9EZoTnKCeFeIedhnKWuB3JHW2l1g9NA=.sha256)
|
||||
- [git-ssb-web](%q5d5Du+9WkaSdjc8aJPZm+jMrqgo0tmfR+RcX5ZZ6H4=.sha256)
|
||||
|
||||
## roadmap
|
||||
|
||||
_rough draft, subject to change_
|
||||
|
||||
- upgrade pub service
|
||||
- update `ssb-pub` to use docker-compose (so we can host multiple Scuttlebutt processes in the same service)
|
||||
- add `ssb-viewer`
|
||||
- add `git-ssb-web`
|
||||
- prototype hub swarm
|
||||
- setup single "hub manager" to be docker swarm manager
|
||||
- run mock provider service on manager
|
||||
- setup many "hub worker"s to be docker swarm workers
|
||||
- create provider service
|
||||
- upgrade mock provider service to include postgres and redis databases
|
||||
- scaffold web api, web app, swarm worker, and mailer worker
|
||||
- implement provider web app user flows
|
||||
- automate swarm
|
||||
- implement swarm orchestration functionality
|
||||
- start business
|
||||
- understand costs, determine prices, forecast profit/loss
|
||||
- decide on company jurisdiction and legal structure
|
||||
- [copy](https://getterms.io/) or create (with help) a Terms of Service & Privacy Policy
|
|
@ -1,271 +0,0 @@
|
|||
# dev diary
|
||||
|
||||
## 2018-03-29
|
||||
|
||||
@dinosaur
|
||||
|
||||
- setup [ButtCloud.org](http://buttcloud.org) and various linked services (GitHub, Docker Cloud, Twitter, Gmail)
|
||||
- started [`buttcloud/meta`](https://github.com/buttcloud/meta) repo to store any meta information (including [these dev diary entries](https://github.com/buttcloud/meta/blob/master/diary.md))
|
||||
- started [`buttcloud/butt-landing](https://github.com/buttcloud/butt-landing) to be a simple public landing page for pub servers
|
||||
- working towards a multi-service pub using Docker Compose, i realized `ssb-viewer` and `git-ssb-web` were non-trivial to install in typical environments
|
||||
- the plan is to use this as a simple secondary service to get a multi-service pub working, then later can focus on the other secondary services
|
||||
|
||||
## 2018-03-30
|
||||
|
||||
@dinosaur
|
||||
|
||||
- made [Docker image](https://hub.docker.com/r/buttcloud/butt-landing) for `buttcloud/butt-landing`
|
||||
- extracted minimal peer server and client code from `scuttlebot` into [`buttcloud/butt-peer`](https://github.com/buttcloud/butt-peer)
|
||||
- added custom logging plugin which uses [`pino`](https://github.com/pinojs/pino), to try and have a consistent logging system across services
|
||||
- made [two Docker images](https://hub.docker.com/r/buttcloud/butt-peer), one for `butt-peer-server` and one for `butt-peer-client`
|
||||
- i combined them so i could use the client code in the server healthcheck
|
||||
|
||||
## 2018-04-03
|
||||
|
||||
@dinosaur
|
||||
|
||||
- started `buttcloud/butt` as `docker-compose.yml` of peer server, landing server, and nginx proxy
|
||||
- update `butt-peer-server` and `butt-peer-client` to not use `node` user, easier to start with default `root` user
|
||||
- why? i ran into an error with volume data permissions, would rather punt to later
|
||||
- UPDATE: changed this back, got it working with `node` user, needed to create volume in `Dockerfile` then mount external volume at same path
|
||||
- update `butt-landing` to auto re-connect to sbot, so it doesn't error when sbot is not yet up
|
||||
- why? this is the recommended way to have docker services depend on each other, `docker-compose.yml` v3 not longer supports `depends_on: condition: healthy`
|
||||
- setup Docker Hub automated builds to build tagged images based on git version tags
|
||||
- match tag name: `/^v[0-9.]+$/`, docker tag is same
|
||||
|
||||
## 2018-04-04
|
||||
|
||||
@dinosaur
|
||||
|
||||
- got minimal `buttcloud/butt` working!
|
||||
- iron out some kinks...
|
||||
|
||||
## 2018-04-08
|
||||
|
||||
@dinosaur
|
||||
|
||||
- switch to focus on Docker Swarm
|
||||
- change to use Traefik instead of Nginx Proxy
|
||||
|
||||
## 2018-04-09
|
||||
|
||||
@dinosaur
|
||||
|
||||
- keep trying to get the Swarm setup to work, grr...!
|
||||
|
||||
## 2018-04-13
|
||||
|
||||
@dinosaur
|
||||
|
||||
- take a break from Swarm for meow
|
||||
- first pass at scaffolding [`buttcloud/buttcloud-provider`](https://github.com/buttcloud/buttcloud-provider)
|
||||
- have a working web server, browser app, and worker, but not yet complete to start feature development
|
||||
|
||||
## 2018-04-14
|
||||
|
||||
@dinosaur
|
||||
|
||||
- more progress toward provider app scaffolding
|
||||
|
||||
![buttcloud diary](./images/2018-04-14-buttcloud-landing.jpg)
|
||||
|
||||
## 2018-04-15 to 2018-04-17
|
||||
|
||||
@dinosaur
|
||||
|
||||
provider app has landed!
|
||||
|
||||
![provider app landing](./images/2018-04-17-buttcloud-landing.webm)
|
||||
|
||||
- integrate `redux-bundler`
|
||||
- add emojis
|
||||
- found seamless background image to tile on landing page
|
||||
- start onboarding workflow
|
||||
- implement start step of onboarding
|
||||
- validate forms on client
|
||||
- validate service calls on server, show errors in form
|
||||
- show success or failure messages as snackbar
|
||||
- after form submission (which creates the user)
|
||||
- generate json web token that identifies user
|
||||
- send welcome email to next page of onboarding with token
|
||||
- emails are sent by queuing a delayed job to a worker (`node-resque`)
|
||||
- setup decent email templates with `mjml`
|
||||
- store user in local storage in case they refresh page before progressing
|
||||
- show help text on page
|
||||
- allow user to resend onboarding email
|
||||
|
||||
## 2018-04-18
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
back to the infra side, during breakfast this morning i figured out why `buttcloud/butt` was failing!
|
||||
|
||||
i had a hunch that it had to do with the address that `sbot` was binding to. i configured `host` as `example_butt-peer-server`, since that's how the Docker service was to be identified within the Docker network. but still, the health checker inside the service couldn't find it. i changed this to `0.0.0.0` and it works!
|
||||
|
||||
did the same for the landing service. now the stack comes online, you can `curl -H "Host: example.butt.nz" localhost` and get the output from the landing page associated with `example.butt.nz` (proxied by `traefik`).
|
||||
|
||||
next i added a [custom plugin to `butt-peer-server`](https://github.com/buttcloud/butt-peer/blob/3c4390907eebe18f98e5f5d9c839161b9d1e001e/server/plugins/address.js) that allows you to configure `externalHost`, in case it differs from `host`. this means we can bind to `host` (like `0.0.0.0`) but advertise our public multiserver address as `example.butt.nz` (like for invites).
|
||||
|
||||
then, on a whim from @mischa, i went [back to `buttcloud-provider` to swap `redux-form` for `final-form`](https://github.com/buttcloud/buttcloud-provider/pull/4), easy as.
|
||||
|
||||
made up some issues, want to step back to think about the next steps from here.
|
||||
|
||||
also made the ButtCloud logo!
|
||||
|
||||
![ButtCloud logo](./images/logo.png)
|
||||
|
||||
## 2018-04-19
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- setup contributor license agreement: https://github.com/buttcloud/meta/issues/6
|
||||
- setup kanbans
|
||||
- [dev](https://github.com/orgs/buttcloud/projects/1)
|
||||
- [ops](https://github.com/orgs/buttcloud/projects/2)
|
||||
- [biz](https://github.com/orgs/buttcloud/projects/3)
|
||||
|
||||
## 2018-04-26
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- start to separate pub and hub stacks in swarm setup: https://github.com/buttcloud/butt/commit/426deb39b9880100fe82ba5960da3d43fe74c452
|
||||
- worked on deploy for web app demo: https://github.com/buttcloud/buttcloud-provider/pull/9
|
||||
- browser code is up at: <https://demo.buttcloud.org> (using netlify for free)
|
||||
- api server is up at <https://buttcloud-demo.herokuapp.com/> (using heroku for free)
|
||||
|
||||
## 2018-04-27
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- discovered and documented bug with `tinyify`: https://github.com/browserify/tinyify/issues/10
|
||||
- add standard style setup to web app: https://github.com/buttcloud/buttcloud-provider/pull/10
|
||||
|
||||
## 2018-04-30
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- demo is now live! [demo.buttcloud.org](https://demo.buttcloud.org) :sheep:
|
||||
- renamed sub-projects to either `buttpub*` or `butthub*`, to standardize language: https://github.com/buttcloud/meta/issues/7
|
||||
- setup continuous integration for `butthub-provider`: https://github.com/buttcloud/butthub-provider/pull/11
|
||||
- setup ButtCloud account with OVH
|
||||
- apply for their startup support program (for maybe $1k cloud credit): https://www.ovh.com/world/dlp/
|
||||
- play with `docker-machine` to create a local swarm across many machines
|
||||
- get the swarm scripts from `buttpub` working, now across multiple virtual machines
|
||||
|
||||
## 2018-05-01
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
started [`docker-up`](https://github.com/buttcloud/docker-up): opinionated glue to manage our Docker swarm
|
||||
|
||||
## 2018-05-02
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
continued with `docker-up`
|
||||
|
||||
- ended up making a fun little continuable (`cb => {}`) based async flow control library in `./util/async.js`, maybe will publish as `flowstep`
|
||||
- realized that the Docker API doesn't handle the `docker stack *` functionality, that's implemented in the Docker CLI
|
||||
- i learned that a "stack" is really a set of networks, volumes, and services each with a label "com.docker.stack.namespace" to reference the stack name
|
||||
- have to decide whether
|
||||
- a) to continue using the Docker API and implement that functionality ourselves
|
||||
- b) to move to using the Docker CLI
|
||||
- for now, will go with option a) !
|
||||
- reading the Docker CLI code, it's not scary or complex
|
||||
- this way we have more low-level control of the Docker Swarm
|
||||
- this way we can focus on exactly what we need for ButtCloud
|
||||
|
||||
## 2018-05-03
|
||||
|
||||
more `docker-up`, getting close to `v1`! :balloon:
|
||||
|
||||
- add executable cli
|
||||
- clean up the api
|
||||
- fractal stacks!
|
||||
- top-level config is a stack, with stacks all the way down
|
||||
- each stack has services, networks, volumes, AND NESTED STACKS
|
||||
- each stack _may_ have a name to namespace associated services
|
||||
- pretty configurable logging
|
||||
|
||||
next up (notes to self):
|
||||
|
||||
- better cli (take in resource type)
|
||||
- use explicit docker version in api requests
|
||||
- add "com.docker.stack.namespace" label to be legit docker stack
|
||||
|
||||
gotta work with @Mischa on another contract meow, then Art~Hack!
|
||||
|
||||
## 2018-05-04
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- reviewed @austin's sweet pull request to `butthub-provider`: https://github.com/buttcloud/butthub-provider/pull/13
|
||||
- completed the "next up" features for `docker-up` in [the previous entry](%p6giuIpqWY242inxUqUdMi1RqVKU0JCPZZWJYjL1i8Q=.sha256)
|
||||
|
||||
## 2018-05-07
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- published `docker-up/util/async.js` as [`callstep`](https://github.com/ahdinosaur/callstep), wrote up a splash of documentation :walking_man:
|
||||
|
||||
## 2018-05-08
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- `docker-up`: add basic integration and unit tests using `ava`, clean up log and config wrappers using composable callsteps: https://github.com/buttcloud/docker-up/commit/29655b561b781331fc4b3a2455ea15e7360bb111
|
||||
- cc @ike
|
||||
- `butthub-provider`: look into adding integration tests using `codecept`
|
||||
- not ButtCloud, but got sponsored by TickTack to improve `ssb-pub`: https://github.com/ahdinosaur/ssb-pub/pull/10
|
||||
|
||||
## 2018-05-09
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- `butthub-provider`: end-to-end acceptance testing with codecept: https://github.com/buttcloud/butthub-provider/pull/14
|
||||
|
||||
## 2018-05-10
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- `butthub-provider`: battled some end-to-end testing dragons :dragon: : https://github.com/buttcloud/butthub-provider/pull/14
|
||||
- integrated the entire web app stack (api server, asset server, worker, and mailer) in the codecept process
|
||||
- at the end of the tests, the process was hanging, who was still running?
|
||||
- with some help from `why-is-node-running` and heaps of reading dependency internals, started the journey to find every remaining handle, gotta catch 'em all! :racehorse:
|
||||
|
||||
## 2018-05-11
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- `butthub-provider`: won the end-to-end test war: https://github.com/buttcloud/butthub-provider/pull/14
|
||||
- cleaned up every last handle, so the test process cleanly exists meow
|
||||
- which means continuous integration now includes end-to-end server + browser tests! :raised_hands:
|
||||
- travis gives us a running postgres and redis database, how nice
|
||||
- `butthub-provider`: finish a boring dependency upgrade: https://github.com/buttcloud/butthub-provider/pull/12
|
||||
- `docker-up`: https://github.com/buttcloud/docker-up/pull/4
|
||||
- the plan was to add update for services, but along the way i realized many things were broken:
|
||||
- each resource uses a different identifier!
|
||||
- `down` should check if resource exists before `remove`
|
||||
- `up` returns output of inspect
|
||||
- [generic resource creator](https://github.com/buttcloud/docker-up/blob/55cb293d42e9ec8cf7d15394ad9115db2cb17f26/resources/generic.js) now takes:
|
||||
- `name`
|
||||
- `hasUpdate`: true for `service`, false otherwise
|
||||
- `idField`: network uses `Id, volume only has `Name`, service uses `ID`
|
||||
- `docker-up`: add continuous integration tests: https://github.com/buttcloud/docker-up/pull/5 :white_check_mark:
|
||||
- travis even gives us running docker to play with!
|
||||
|
||||
## 2018-05-15 - 2018-06-09
|
||||
|
||||
@ahdinosaur
|
||||
|
||||
- am starting to finally understand some advanced fp (functional programming) concepts like monads
|
||||
- `docker-up`: investigate using `sanctuary`
|
||||
- `docker-up`: port code to use `ramda`, `folktale`, `folktale-validations`, and `fluture`
|
||||
- `docker-up`: re-architect how everything works
|
||||
- given next config, translate into docker api config
|
||||
- fetch all current docker api config
|
||||
- diff docker api current and next configs
|
||||
- show diff to sysadmin
|
||||
- if acceptable, translate the diff into docker api commands and run those
|
||||
- rename `docker-up` to `gyne`
|
||||
- rename ButtCloud to PeachCloud
|
||||
- get example swarm working across 3 virtual machines using `docker-machine` and `gyne`
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6b1f6b3c3edda9a0208155587af991924b174e34303f1b146ff6d3134f906a50
|
||||
size 78050
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:245f952d53518713ecb90521b30131ae449edeb6226f679b837e7eb02f9d84d5
|
||||
size 704447
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0fa0ec60fa75b8347bd56d6a5eb5bd54d838b6f3f038e3d3b1a2082a38339604
|
||||
size 38577
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:704c4826e9d1a045dc7d3a066e2bb850d3ae9f4a2d005b08d73462ae298ac352
|
||||
size 5831
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6bd71ddde0172abdcb3c5953f23e7f1324dc4f7dd3d4e9b720308d865cce2859
|
||||
size 34537
|
|
@ -1,3 +0,0 @@
|
|||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fb27730252530f3e7a8db2817842a4883d36eddd7492511d592d42c2bea571ac
|
||||
size 5741
|
|
@ -1,19 +0,0 @@
|
|||
# Contributor License Agreement
|
||||
|
||||
to contribute to ButtCloud, you must first sign a Contributor License Agreeement.
|
||||
|
||||
## why?
|
||||
|
||||
@ahdinosaur, the steward of ButtCloud, is committed to open source, at the moment all the code is licensed under the AGPL-3.0 copyleft licence.
|
||||
|
||||
but we don't the ButtCloud project to be locked in to a legacy license, when promising new licenses such as a [License Zero](http://licensezero.com/) explore new legal territories, where we may in the future want to move to a peer production, copyfarleft, or reciprocity license.
|
||||
|
||||
a Contributor License Agreement, as implemented here, allows contributors to grant a broad license to @ahdinosaur, the steward of ButtCloud.
|
||||
|
||||
## how?
|
||||
|
||||
once you contribute something significant, @ahdinosaur will contact you and setup a digital signature process using [HelloSign](https://hellosign.com).
|
||||
|
||||
the document to sign is [this Individual Contributor License Agreement](https://drive.google.com/file/d/11bR0SIPjCjdBLi-p-XZo2CBPBeguCdAS/view?usp=sharing).
|
||||
|
||||
after you sign, the document will be uploaded to a [drive](https://drive.google.com/drive/u/4/folders/1BZ0JezJ_9DhJ2HgpoyDV4qirpjcAXIyi) for safe storage.
|
Loading…
Reference in New Issue