Secure your course project, and only let the instructor listen!
HearMyPaper is a modular monolith application designed to protect academic work using end-to-end encryption. Students seal their submissions with the instructor's public key, ensuring that only the intended recipient can access the content.
This project uses a modern Python stack with uv for dependency management, mise for task orchestration, and Docker for infrastructure.
- uv - Python package manager
- mise - Universal task runner and tool manager
- Docker & Docker Compose
You can spin up the required infrastructure (Postgres, Redis, MinIO, RabbitMQ) using Docker Compose profiles.
Start only infrastructure:
docker compose --profile infra up -dStart the full stack (Infra + Leader API):
docker compose --profile infra --profile app up -dIf you prefer running the applications locally while using Docker only for the database and services:
-
Setup environment:
uv sync
-
Run migrations:
mise run leader:migrate
-
Launch applications: We use
miseto simplify common development tasks. You can run:mise run leader:dev: Starts the Leader API (BlackSheep) with hot-reload.mise run client:dev: Launches the BeeWare Toga desktop client in development mode.
Important
Briefcase & uv Integration: Briefcase does not currently support uv workspace dependencies. Before running any briefcase command (including mise run client:dev), you must manually comment out the workspace-based dependencies in apps/client/pyproject.toml (e.g., shared-kernel, client-core, etc.). The project is configured to include these sources directly via Briefcase's sources configuration.
mise acts as a powerful task runner. You can explore all available tasks by running mise tasks. Key tasks include:
leader:init-user: Creates an initial admin user in the system.gen-session: Generates a JWT session token for client authentication.
The Leader API provides an OpenAPI UI at /docs. However, please note several architectural limitations:
- Response Documentation:
blacksheepdoes not support automatic response type discovery via generics. Explicitly documenting responses requires access to theOpenAPIHandlerinstance within API adapters. - Architectural Constraint: In our modular monolith design, API adapters are decoupled from the documentation engine. Since there is no clean way to inject the
OpenAPIHandlerinto these isolated modules, response models are currently not visible in the UI. - UI Limitation: OpenAPI v3 hides undocumented responses. Consequently, the
/docsUI may not show the expected data structures. - Workaround: We recommend using Browser Developer Tools (Network Tab) or external tools like Postman/Insomnia to inspect actual API responses.
For manual API testing, use the mise run gen-session script. It generates a valid JWT that you can use in the Authorization: Bearer <token> header.
The HearMyPaper client is a native desktop application built with BeeWare:
| Platform | Status | Format |
|---|---|---|
| Windows | ✅ Supported | .msi Installer |
| Linux (Ubuntu/Debian) | ✅ Supported | .deb Package |
| macOS | ✅ Supported | .app Bundle |
HearMyPaper is licensed under the MIT License. See the LICENSE file for details.
Developed by:
- Mykola Ratushniak
- Neholiuk Oleksandr
Built with:
- BeeWare Toga - Native GUI framework
- uv - Fast Python package management
- BlackSheep - Fast ASGI web framework
- PyNaCl - Networking and Cryptography library