Online management tool for end2end encrypted files and documents.
- User data is client side encrypted using a private master key
- Changes are synchronized live between different devices / browser tabs of the same user
- Backend can be horizontally scaled to multiple container instances
- Common code is shared between server backend and web frontend
- Kotlin Multiplatform (share code between frontend and backend)
- Ktor (network framework for client & server)
- Kotlinx Serialization (for JSON in REST API)
- Insert-Koin (dependency injection framework)
- Exposed (ORM framework for SQL in Kotlin)
- KMongo (ORM framework for MongoDB in Kotlin)
- Kotlinx Coroutines (non-blocking programming)
- Kotlin-Logging (multiplatform logging framework)
- React (for frontend of web-app, see Kotlin/JS for React)
- Material UI + Muirwik (provide react components)
- Mockk (Help mocking in test units)
- PostgreSQL for user management and references / labels
- MongoDB for encrypted notes to allow updating only a single line
- Minio Amazon S3 compatible container as storage for encrypted files
- Gradle multi-project (all subprojects included in one repo)
- Automated JUnit-Tests with GitHub Actions
- Provide docker-compose file for backend setup
- Documentation with latex template and plant-uml
- Make backend technology decisions
- Create running project for backend
- Configure Dockerfile for backend
- Configure Docker-Compose
- Configure ktor for backend
- Make frontend GUI design decisions
- Create running projects for frontend: android, web/pc
- Experiment with compose and painter-library and react
- Implement frontend login with react
- Configure reverse proxy: nginx or traefik
- Call REST-API from frontend on login event
- Implement logout button in frontend
- Decide which database to use for user management, file management.
- REST-API server implementation for user registration & login
- SQL DAO elements for user registration & login
- Connect websocket to backend server
- Remove JWT cookie on logout
- Simplify debugging without complete rebuild
- Ensure session restored after page reload
- Make frontend work on Android
- Build Electron app for PC
- Provide hosted web-app online
- Implement mongodb data structure for text documents
- Implement algorithm for detecting changed lines in text
- Implement live sync for document edit
- Implement text editor in frontend
- Allow offline access in Android app
- Implement file upload / download
- Encrypt files and documents
- Configure Grafana & Prometheus
- Provide statistics with Ktor: /metrics
- Multi instance Redis support
To build the android project ensure the file local.properties
exists in root project structure with following content.
Make sure the android sdk is installed and path is correct.
sdk.dir=/opt/android
Note when opening the full project with Android Studio, the local.properties
file will be generated automatically.
Build all modules, including android:
gradlew build
(Note: Java 16+ may cause build failures)
To skip the tests while Gradle build run:
gradlew build -x test
Start backend using docker (opens reverse-proxy on port 80):
sudo docker-compose up --build
Cleanup data and volumes:
sudo docker-compose down -v
Debug web-app (opens dev-server on port 8081):
gradle :web-app:browserDevelopmentRun --continuous
- Logic in code: Keep it simple, stupid
- Write everything in english language
- Commit messages with convention from Chris Beams
- Kotlin coding conventions