About
Group Income is voluntary, decentralized, end-to-end encrypted basic income for you and your friends.
Getting Started
- Install Node.js (v20 minimum required)
- Install Grunt:
npm install -g grunt-cli - Clone this repo (or a fork of it if you plan on contributing) and
cdinto it. - Install dependencies:
npm install - Run
./node_modules/.bin/chel init. This generates achel.tomlconfig file in the project root (required). - Now try out the dev workflow.
- 👩🎨 Check out how Group Income will feel like by taking a look at the design files on Figma
Contributing
We use standard for the code style and Github project boards for efficient project management.
We are continually improving the user experience for everyone, and applying the relevant accessibility standards. We will be conformant with WCAG 2.0 Level AA and trying our best to reach Level AAA in some areas of the application.
Read first
- __:book: CONTRIBUTING.md (required reading to send a PR!)__
- :book: Getting Started — Modern frontend concepts & project overview
- :book: Style Guide — Our development guidelines
- :book: Information Flow - walkthrough of the logical layer
Basic workflow
To get started with development, follow the steps in Getting Started first.
Run all servers + watch files for changes
grunt dev
- If all went well you should be able to visit http://localhost:3000
Try ngrok (recommended), zrok, tunnl.gg, localhost.run or serveo instead, e.g.:
$ grunt dev
then, in another terminal:
$ ngrok http http://localhost:8000
or:
$ ssh -R 80:localhost:8000 [email protected]
Clean up files in dist/:
grunt clean
Run tests:
NOTE: You may need to first install Cypress using ./node_modules/.bin/cypress install
# all tests
grunt test
all tests while skipping build step
grunt test --skipbuild
unit tests only (always skips build)
grunt test:unit
show e2e tests (Cypress) live in a browser
grunt test --browser
run e2e tests (Cypress) in "open" mode
grunt test --browser=debug
Developing at the same time as writing E2E tests
grunt dev
and in another terminal run Cypress in "open" mode
npm run cy:open
Run a specific Cypress spec against the running 'grunt dev' server:
npx cypress run -c 'baseUrl=http://localhost:8000' --spec "test/cypress/integration/group-chat.spec.js"
This project is tested with BrowserStack.
Using Docker for extra security
You can run commands in a Docker container by using npm run docker -- instead.
For example:
npm run docker -- npm install
npm run docker -- grunt dev
npm run docker -- grunt test --skipbuild
For details, see: Docker.md
Troubleshooting
If you run into any errors during the setup, try the suggestions in Troubleshooting.md.
Making a release
The app and its contracts share one version number. The version field in
package.json is the source of truth. grunt pin copies it to appVersion
in chelonia.json and pins the selected contracts to that version. A version
is never passed on the command line.
1. Bump the version
$ npm version --no-git-tag-version 2.9.0
This updates package.json and package-lock.json without committing, so the
version bump can be committed together with the pinned contracts in step 2.
2. Pin the contracts
Pinning freezes a built copy of each contract into
contracts/. Old versions are kept forever so that
clients running older versions keep working.
First check which contracts changed since the last release:
$ git diff --name-only v2.8.0 master -- frontend/model/contracts
Files under frontend/model/contracts/shared/ are bundled into every contract
that imports them. A change there means every importing contract changed, even
if the contract's own file did not.
# Print usage (also shows current vs. target appVersion):
$ grunt pin
Copy the version to chelonia.json and pin every contract:
$ NODE_ENV=production grunt pin --all
Copy the version only (app update with no contract changes):
$ NODE_ENV=production grunt pin --none
Copy the version and pin only the named contract:
$ NODE_ENV=production grunt pin:chatroom
Add --overwrite to replace an already-pinned version on disk.
Commit the pinned snapshot together with the files from step 1:
$ git add package.json package-lock.json chelonia.json contracts/
$ git commit -m "v2.9.0"
3. Tag and build
$ git tag -u '<email>' v2.9.0 # create the tag before calling grunt deploy
$ ./scripts/dist.sh
dist.sh reads the version from package.json, builds the app twice (debug
and production), and writes gi-v2.9.0.tgz archives.
Donating
Donations to the okTurtles Foundation support the development of Group Income and related projects.
License
AGPL-3.0. See LICENSE for license details and CONTRIBUTING.md for the contribution policy.
