Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test file sharing #152

Closed
wants to merge 109 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
7125260
Pb 15 testing (#1)
annabjorgo Aug 10, 2023
9692d4b
Pb 15 testing (#3)
annabjorgo Aug 10, 2023
313db90
Migrate to next js & implement landing page design (#2)
stianjsu Aug 10, 2023
d712b78
feat(husky): properly sets up husky (#4)
stianjsu Aug 10, 2023
f82fb86
Pb 15 testing (#5)
annabjorgo Aug 11, 2023
63ecaf9
Pb 15 testing (#6)
annabjorgo Aug 11, 2023
b5d92e8
Pb 15 testing (#7)
annabjorgo Aug 11, 2023
414bd4e
Pb 15 testing (#8)
JacobTheisen Aug 14, 2023
2e642f5
PB-14p: Docker nginx next frontend (#9)
stianjsu Aug 15, 2023
21b1455
PB-17k: Cookie based auth (#10)
stianjsu Aug 16, 2023
848cfc0
Bot language generalization (#12)
JacobTheisen Aug 18, 2023
ca02f5a
hotfix: fix auth since cookies not set in prod (#14)
stianjsu Aug 18, 2023
0e0a71a
feat(ci): adds gh actions for frontend (#11)
stianjsu Aug 21, 2023
c032543
set up foundation for admin panel (#15)
annabjorgo Aug 21, 2023
4bb26e1
Code review, file structure and export convention (#17)
sergiosja Aug 21, 2023
a6279e5
PB-17h: Login redirects and auth (#16)
stianjsu Aug 21, 2023
81d31ec
Bot language generalization (#20)
JacobTheisen Aug 28, 2023
c33d817
fix: removes undefined botapiconfiguration import (#22)
stianjsu Aug 29, 2023
4e2bad5
fix: sets up gh-actions linting and fixes pre-commit hook (#19)
stianjsu Aug 30, 2023
48c3935
Slack users fetching (#18)
sergiosja Aug 31, 2023
01e4cdc
dev-env: env file for docker-compose (#24)
stianjsu Sep 2, 2023
2db167e
PB-15d: Install bot to slack workspace (#21)
stianjsu Sep 4, 2023
8b21b09
Fetch restaurants in new frontend (#23)
sergiosja Sep 5, 2023
2752d26
Bugfix lmdb installation (#25)
JacobTheisen Sep 9, 2023
b80d65e
Mutation reqs (#26)
JacobTheisen Sep 9, 2023
fb5b04e
Switch deployed frontend to Next js (#30)
stianjsu Sep 13, 2023
2c9eba6
PB-30b: implements toggling active on workspace users (#31)
stianjsu Sep 14, 2023
da3c4f9
Add restaurants (#34)
sergiosja Sep 18, 2023
5bb64dd
pb-35b/add functionality for posting and deleting events (#38)
annabjorgo Sep 25, 2023
c54f0e2
PB-17h: Logout user (#32)
stianjsu Sep 27, 2023
5fd23a4
Implemented new design for admin panel (#39)
sergiosja Sep 28, 2023
c81b455
Create staging (#41)
JacobTheisen Sep 28, 2023
f1a101f
Create staging (#42)
JacobTheisen Sep 29, 2023
87ddfe4
Create staging (#43)
JacobTheisen Sep 29, 2023
5042d24
Create staging (#45)
JacobTheisen Sep 29, 2023
476e7e7
Implemented new navbar design (#44)
sergiosja Sep 29, 2023
1ca08ca
Create staging (#46)
JacobTheisen Sep 29, 2023
4f3c2ea
push current main to prod. (#47)
JacobTheisen Sep 29, 2023
c964561
test terraform configs (#48)
JacobTheisen Sep 29, 2023
0ce873f
Prod env testing (#50)
JacobTheisen Oct 2, 2023
5300f72
Prod env testing (#52)
JacobTheisen Oct 2, 2023
c0f3557
Merge branch 'prod'
JacobTheisen Oct 2, 2023
28b92a9
PB-39c: Updated CardComponent and Events view (#49)
sergiosja Oct 11, 2023
ab7abd7
Enforce https (#37)
JacobTheisen Oct 11, 2023
dc4be4a
PB-39k: Custom calendar for events (#53)
sergiosja Oct 19, 2023
372b69d
PB-39n: Sketch of event cards (#55)
sergiosja Oct 24, 2023
594d363
PB-39r: Integrating cards with calendar (#58)
sergiosja Oct 25, 2023
d842060
Pb-16: users from channel (#36)
stianjsu Oct 26, 2023
c650f4e
bugfix; user left channel (#61)
JacobTheisen Oct 26, 2023
ffd8b57
Pb 39h/admin onboarding page (#54)
annabjorgo Oct 28, 2023
7545d82
Bugfix eventModal (#59)
JacobTheisen Oct 29, 2023
d1c2f62
Styling Cleanup (#62)
annabjorgo Nov 2, 2023
02cec09
PB-39ae: Bugfix create event onboarding (#63)
JacobTheisen Nov 2, 2023
f865122
PB-39t: fix focus on calender and event components (#64)
JacobTheisen Nov 2, 2023
222d38d
PB-39af: minor fix to display active users in adminpanel (#65)
JacobTheisen Nov 2, 2023
2009869
PB-27m: fix; removes darkmode (#66)
JacobTheisen Nov 2, 2023
044f3ad
feat: adds login button to landing page (#68)
stianjsu Nov 2, 2023
755e5a8
feat: adds redirect to onboarding if no resturants added (#69)
stianjsu Nov 2, 2023
40bd74b
Adding add button to make it more clear for users, enter still work (…
JacobTheisen Nov 2, 2023
3e2f784
Style add restaurant modal (#71)
JacobTheisen Nov 2, 2023
584bf42
fix: remove old landing page for user test (#72)
stianjsu Nov 2, 2023
a9047ec
fix: adds missing key props to event calendar (#75)
stianjsu Nov 9, 2023
bd1ab17
Pb-39z: adds invitation status frontend (#74)
stianjsu Nov 9, 2023
ccae835
pb-39e: People card display channel name (#73)
stianjsu Nov 9, 2023
073e25f
PB-47o: Put same colour on all borders in calendar (#79)
sergiosja Nov 9, 2023
9445a56
pb-47h: disables image sharing feature (#78)
stianjsu Nov 9, 2023
d14b520
PB-50: Refactor modal logic + remove unused files (#80)
JacobTheisen Nov 10, 2023
98ceadc
PB-47l: remove onboarding redirect (#77)
stianjsu Nov 10, 2023
4f6d464
Update admin frontend (#76)
annabjorgo Nov 10, 2023
cead060
Pb-47b: configurable event time (#82)
stianjsu Nov 10, 2023
777dcd2
Pb 47r nested modal logic (#81)
JacobTheisen Nov 10, 2023
e995f2f
Updated navbar to match newest Figma sketches (#83)
sergiosja Nov 10, 2023
9c81da6
Pb 47 event calender modal (#85)
JacobTheisen Nov 10, 2023
f6cf9a2
add toaster when no restaurants added (#84)
annabjorgo Nov 10, 2023
0957867
Bugfix; infinite modals (#87)
JacobTheisen Nov 19, 2023
6a9b126
PB-48f: Start implementing new landing page (#89)
sergiosja Nov 19, 2023
c05c396
pb-47j: adds command for getting url to admin panel (#86)
stianjsu Nov 20, 2023
a06b71f
make eventcalandar and events the same height (#91)
annabjorgo Nov 22, 2023
71a175d
Quick fix to calendar colours (#92)
sergiosja Nov 27, 2023
55fdeb5
PB-48c: Added second section (#90)
JacobTheisen Nov 28, 2023
db4e70b
PB-48i: Sixth section (#94)
sergiosja Nov 28, 2023
bf1fe1e
PB-48g: Fourth section (#93)
sergiosja Nov 28, 2023
3b2d0d3
PB-48h: Added svgs, removed old unused svg
sergiosja Nov 28, 2023
bf12c0d
PB-48h: Added custom colours and created component for postits
sergiosja Nov 28, 2023
22a685e
PB-48h: Started on fifth section and added it to Landing index page
sergiosja Nov 28, 2023
841d62d
Revert "PB-48h: Added svgs, removed old unused svg"
sergiosja Nov 28, 2023
9a2dba6
Revert "PB-48h: Added custom colours and created component for postits"
sergiosja Nov 28, 2023
89945ab
Revert "PB-48h: Started on fifth section and added it to Landing inde…
sergiosja Nov 28, 2023
09c4e3b
Third Section in Landing Page (#95)
annabjorgo Nov 30, 2023
dc4827a
PB-48h: Fifth section (#99)
sergiosja Dec 6, 2023
4347609
feat: adds Footer component to Landing page (#96)
stianjsu Dec 7, 2023
bd7b4f7
PB-58: Bot dm's user instead of joining general (#88)
stianjsu Dec 7, 2023
eda6ddf
pb-60: update login and callback pages (#97)
stianjsu Dec 10, 2023
0d3c54c
Pb-63: fix padding issue on sections (#101)
stianjsu Dec 18, 2023
36d4e29
feat: updates illustrations sect 3 and improves responsiveness (#105)
stianjsu Dec 18, 2023
1c5487f
Pb-65: responsive fifth section (#106)
stianjsu Dec 19, 2023
47dbc32
Pb 66 sections in landing more consistent (#107)
annabjorgo Dec 20, 2023
a4d7ad1
Renaming to consistent pizzabot name (#103)
JacobTheisen Dec 20, 2023
881dbe4
Improving the process of syncing users to channels (#104)
JacobTheisen Dec 31, 2023
5ffba93
Pb 59 mobile friendly landing page (#109)
annabjorgo Jan 2, 2024
a501d83
Update first section (#110)
JacobTheisen Jan 2, 2024
4e63069
pb-67: admin page mobile friendly (#108)
stianjsu Jan 2, 2024
6e666e7
Last Tweaks: Codebase cleanup and doc (#111)
stianjsu Jan 3, 2024
51c93c8
fix: default active field on users to update to false (#112)
stianjsu Jan 3, 2024
5766f55
Release new app version before handover (#113)
stianjsu Jan 8, 2024
17ef3ab
PB-69: fix new users joining channel dont get added to db (#114)
JacobTheisen May 21, 2024
9226b7e
PB-69: Bugfix user join channel (#115)
JacobTheisen May 21, 2024
dd381c9
merge prod
JacobTheisen May 21, 2024
6b8eb45
Allow file sharing
sergiosja Aug 16, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions .github/workflows/ci.yml → .github/workflows/backend.yml
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
name: Build and Test
name: Backend
on:
pull_request:
types: [ opened, synchronize, reopened, closed ]
types: [opened, synchronize, reopened, closed]
branches:
- main
- prod
paths:
- 'application/backend/**'
- "application/backend/**"
push:
branches:
- main
- prod
paths:
- 'application/backend/**'
- "application/backend/**"
jobs:
build-and-test:
runs-on: ubuntu-latest
Expand Down
33 changes: 33 additions & 0 deletions .github/workflows/frontend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Frontend
on:
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
- prod
paths:
- "application/frontend/**"
push:
branches:
- main
- prod
paths:
- "application/frontend/**"
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Set up Node 20.x
uses: actions/setup-node@v3
with:
node-version: 20.x
cache: "npm"
cache-dependency-path: application/frontend/package-lock.json
- name: Install dependencies
working-directory: application/frontend
run: npm ci
- name: Build
working-directory: application/frontend
run: npm run build:production
59 changes: 59 additions & 0 deletions .github/workflows/next-frontend.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Next Frontend
on:
pull_request:
types: [opened, synchronize, reopened, closed]
branches:
- main
- prod
paths:
- "application/next-frontend/**"
push:
branches:
- main
- prod
paths:
- "application/next-frontend/**"

jobs:
linting:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Set up Node 20.x
uses: actions/setup-node@v3
with:
node-version: 20.x
cache: "npm"
cache-dependency-path: application/next-frontend/package-lock.json
- name: Install dependencies
working-directory: application/next-frontend
run: npm ci
- name: Linting
working-directory: application/next-frontend
run: npm run lint
- name: Typechecking
working-directory: application/next-frontend
run: npm run typecheck

# Test that the project compiles
test-build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Set up Node 20.x
uses: actions/setup-node@v3
with:
node-version: 20.x
cache: "npm"
cache-dependency-path: application/next-frontend/package-lock.json
- name: Install dependencies
working-directory: application/next-frontend
run: npm ci
- name: Build
working-directory: application/next-frontend
run: npm run build
env:
# Prevents the build from failing, but doesn't do anything when testing build
NEXT_PUBLIC_BACKEND_URI: http://somerandomurl.test
58 changes: 23 additions & 35 deletions .github/workflows/versioning.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,50 +5,38 @@ on:
- closed
branches:
- main
- prod
paths:
- application/**
- infrastructure/**
- .github/workflows/versioning.yml
jobs:
build:
commit-version:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
ref: ${{ github.sha }}
fetch-depth: '0'
- name: Set up Node.js
uses: actions/setup-node@v3
- name: Install dependencies
run: npm install
working-directory: application/frontend
- name: Build bundle
run: npm run build:production
working-directory: application/frontend
env:
BACKEND_URI: https://api.bot.blank.pizza
- name: Remove build gitignore
run: rm public/.gitignore
working-directory: application/frontend
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Automated Build
branch: build
push_options: '--force'
create_branch: true
- uses: actions/checkout@v3
with:
ref: ${{ github.sha }}
fetch-depth: "0"
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Automated Versioning
branch: build
push_options: "--force"
create_branch: true

create-tag:
needs: build
needs: commit-version
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
ref: build
fetch-depth: '0'
- uses: actions/checkout@v3
with:
ref: build
fetch-depth: "0"

- name: Bump version and push tag
uses: anothrNick/github-tag-action@1.55.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
WITH_V: true
DEFAULT_BRANCH: build
- name: Bump version and push tag
uses: anothrNick/github-tag-action@1.55.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
WITH_V: true
DEFAULT_BRANCH: build
64 changes: 44 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# pizza-app
# PizzaBot v3

![Infrastructure Diagram](https://github.com//blankoslo/Pizza.v2/blob/main/README/infrastructure.png?raw=true)
![Infrastructure Diagram](https://github.com//blankoslo/Pizza.v3/blob/main/README/infrastructure.png?raw=true)

## Slack App Bot setup

1. Go to `https://api.slack.com/apps/`
2. Click the `Create New App` button
3. Choose `from scratch`
Expand All @@ -13,9 +14,9 @@
8. Click `Event Subscriptions`
9. Turn on `Enable Events`
10. Open `Subscribe to bot events`
11. Add the events `file_shared` `message.channels` `message.im` `app_uninstalled` `tokens_revoked`
11. Add the events `file_shared` `message.channels` `message.im` `app_uninstalled` `tokens_revoked` `member_left_channel` `member_joined_channel`
12. Click `OAuth & Permissions` in the menu
13. Go down to `Scopes` and click `Add an OAuth Scope` and add the scopes found in `/application/backend/api/slack`'s GET `/install` method.
13. Go down to `Scopes` and click `Add an OAuth Scope` and add the scopes found in `/application/backend/app/api/slack`'s GET `/install` method.
14. Go to `App Home`
15. Go down to `Show Tabs` and switch on `Messages Tab` (to allow DMs)
16. Go to `OAuth & Permissions` under `Redirect URLs`
Expand All @@ -25,52 +26,75 @@
20. Click `Create new command`
21. Fill in `/set-pizza-channel` under `command`, fill in `This sets the current channel as the pizza channel` under `Short Description`
22. Click `save`
23. Click `Basic Information` in the menu
24. Under App Credentials, copy `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`, `SLACK_SIGNING_SECRET`
25. You now have `SLACK_APP_TOKEN`, `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`, `SLACK_SIGNING_SECRET` which is needed in terraform or docker-compose
23. Add another command `/pizzabot-admin-panel` under `command`, fill in `Link for administrating the pizzabot` under `Short Description`
24. Click `Basic Information` in the menu
25. Under App Credentials, copy `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`, `SLACK_SIGNING_SECRET`
26. You now have `SLACK_APP_TOKEN`, `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`, `SLACK_SIGNING_SECRET` which is needed in terraform or docker-compose

## How to run the system

### Development

The frontend, backend, bot, message queue and database can all be run with docker compose by running `docker-compose up`. Optionally you can do `docker-compose up -d [service]` to only start one or more service. During development all services run behind an nginx instance to simplify their interactions. The ports are 80 and 443.

As we use Ouath2 for authentication we are forced to use https. Nginx needs valid ssl certificates, so you are gonna need to generate one with the command `openssl req -x509 -nodes -newkey rsa:4096 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt -sha256 -days 365` and add it to `application/containers/development`

**NB:** You'll need to supply the docker-compose file with slack credentials as mention in the `Slack App Bot setup` section. You'll also need to supply cloudinary credentials if you want the uninstall handler to properly delete images, you should also update the `upload_preset` in `handle_file_share` in `bot/src/slack/__init__.py` to point to your own cloudinary account.
**NB:** You'll need to supply the docker-compose file with slack credentials as mention in the `Slack App Bot setup` section. These are defined in a `.env` file in `application/containers/development` folder of the project. This file is not commited to the repository, so you have to create it manually. You can use the `.env.example` file as a template inside `application/containers/development`. You'll also need to supply cloudinary credentials if you want the uninstall handler to properly delete images, you should also update the `upload_preset` in `handle_file_share` in `bot/src/slack/__init__.py` to point to your own cloudinary account.

### Slack integration flow

For flow of how the bot is added to a slack workspace, see digram in README/InstallFlow.png
For flow of how login is handled with Slack, see diagram in README/LoginFlow.png

### Good to know

The legacy React app from PizzaBot.v2 is located in application/frontend. This is only used as a reference point for the new frontend with Next.js

Locales doesnt work properly in the alpine container used, meaning it's not a bug if stuff is localized wrong, such as the time string send in pizza event invites.

### Production

#### Terraform Cloud
This repository is connected to Terraform Cloud where it is automatically planned and then manually applied whenever a new tag is created.
The branch used in Terraform Cloud is the `Build` branch, which gets created on every new version. This branch is the same as master, but it also contains the build files for the frontend application.
A tag is automatically created through GitHub actions when a PR is merged into Main.

This repository is connected to Terraform Cloud where it is planned and then manually applied whenever a new tag is created.

Prod and staging live as separate workspaces in Terraform Cloud. The branch used in Terraform Cloud is `main` for the staging environment, and `prod` for the production environment. The `prod` branch is merged from main after the staging environment is tested. Terraform is not set up to automatically listen for changes on the branches (TODO), and a manual update of the target branch might be required to plan a new version.

When a planned version is applied, the changed environments are pushed to Heroku

#### Heroku

We are using terraform to describe the infrastructure, which can be found in the `/infrastructure` folder. In addition to this the backend/bot have `Procfile`, `runtime.txt`, and `.locales` files that describe the process, heroku runtime and additional locales to include. While the frontend have `.static` in the `public` folder to indicate the application folder for the nginx buildpacker, and a `.gitignore` file to keep the files and folder in git.

1. Go into the `infrastructure` folder and run `terraform apply` (not needed if using Terraform Cloud).
2. Go to the app settings of the frontend app in Heroku at `https://dashboard.heroku.com/apps/pizzabot-v2-stag-frontend/settings` (where the text after `/apps/` will be your app's name) and under `Domains` copy the `DNS Target`.
3. Go to the app settings of the backend app in Heroku at `https://dashboard.heroku.com/apps/pizzabot-v2-stag-backend/settings` (where the text after `/apps/` will be your app's name) and under `Domains` copy the `DNS Target`.
4. Create a CNAME record with the hostname specified in the main terraform file for both the frontend and the backend and point them to the `DNS TARGET`s from heroku. After a while routing and SSL should work flawlesly.
2. Go to the app settings of the frontend app in Heroku and under `Domains` copy the `DNS Target`.
3. Go to the app settings of the backend app in Heroku and under `Domains` copy the `DNS Target`.
4. Create a CNAME record with the hostname specified in the main terraform file for both the frontend and the backend and point them to the `DNS TARGET`s from heroku. After a while routing and SSL should work flawlessly.

Infrastructure:
* Backend-app: contains the database, papertrail instance, Rabbitmq instance, and backend application
* Bot-app: contains an attachement to the database, an attachement to the papertrail instance, an attachement to the Rabbitmq instance, the bot worker
* Frontend-app: contains a nginx instance with the build files from the `public` folder

- prod/stag-backend: contains the database, papertrail instance, Rabbitmq instance, and backend application
- prod/stag-bot: contains an attachement to the database, an attachement to the papertrail instance, an attachement to the Rabbitmq instance, the bot worker
- prod/stag-frontend: contains source code of the Next.js-application, which is automatically detected and built by Heroku. The app is then automatically launched using by heroku with `npm run start`, where the correct port is provided with the env-var `$PORT`.

**NOTE** Promoting apps from staging to prod has not been tested. We manually apply new prod and staging instances using Terraform.

## Tests

### Backend

The tests for this application were written using the pytest testing framework. The tests cover the blueprints, services, and broker handlers.

To run the backend tests, navigate to the backend directory of the project and run the following command:

```
python3 -m pytest tests
```

Optionally you can add the options `-k [name of test suit or test function]` (to only run certain tests), `-s` (to show print statements) and `-v`/`-vv` (to make tests more verbose).

### Bot

TODO

## Contributing Guidelines
Expand All @@ -86,11 +110,11 @@ Please follow these guidelines when contributing to this project:

## Code of Conduct

We expect all contributors to adhere to our [Code of Conduct](https://github.com/blankoslo/Pizza.v2/blob/main/CODE_OF_CONDUCT.md). Please read it before contributing.
We expect all contributors to adhere to our [Code of Conduct](https://github.com/blankoslo/Pizza.v3/blob/main/CODE_OF_CONDUCT.md). Please read it before contributing.

## Issue Tracker

If you find any issues or have feature requests, please submit them on the [issue tracker](https://github.com/blankoslo/Pizza.v2/issues).
If you find any issues or have feature requests, please submit them on the [issue tracker](https://github.com/blankoslo/Pizza.v3/issues).

## Contact

Expand All @@ -100,4 +124,4 @@ Thank you for your contributions!

## License

By contributing to Pizza.v2, you agree that your contributions will be licensed under the GNU General Public License v3.0 license. Please see the [LICENSE](https://github.com/blankoslo/Pizza.v2/blob/main/LICENSE) file for more information.
By contributing to Pizza.v3, you agree that your contributions will be licensed under the GNU General Public License v3.0 license. Please see the [LICENSE](https://github.com/blankoslo/Pizza.v3/blob/main/LICENSE) file for more information.
Binary file added README/InstallFlow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added README/LoginFlow.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading