Week #6 #
Links #
- Deployment: http://31.59.170.53:3000
- API Docs: http://31.59.170.53:8080/swagger
- Demo: https://drive.google.com/drive/folders/1Ng3-i41OIIswpilSoouyh_s6slSOx8rE
- Android Application Releases: https://github.com/evops-sum25/evops/releases
- Source Code: https://github.com/evops-sum25/evops
Final Deliverables #
Project Overview #
EvOps is a self-hosted platform to share and discover local events (e.g. performances, parties, or study sessions). You can think of it as a full-stack alternative to the “Opportunities For You” Telegram channel.
While the problem we’re solving isn’t very special or unique, we try to stand out with our implementation. We designed two convenient user interfaces and exposed a fast and robust API.
Features #
Machine Learning:
- Event Multi-Tagging: Automatically assigns multiple relevant tags to university events.
- User Profile Embeddings: Creates unique user profile embeddings based on their interactions (upvotes/downvotes, reactions, etc.) with event posts.
- Event Description Embeddings: Converts event descriptions into numerical embedding vectors.
- Custom University Tagging: Uses a specialized tag list developed based on the “Opportunities For You” Telegram channel.
Back End:
- API methods to create and view users, events, event images, and event tags (groups).
- Combined REST+gRPC web-server so that clients can choose their preferred communication way.
- Auto-generated OpenAPI documentation + Swagger webpage.
- Persistent data storage with PostgreSQL.
- Persistent image storage with MinIO.
- Data validation at the type-system level.
- Basic logging of incoming requests and their responses.
- Configurability with environment variables and a
.envfile. - An
API extension for
clients to ease the interaction with our back end:
- Validation functions (such as
validate_event_titleorvalidate_tag_alias) that reuse the logic from the back-end core. - Fully-typed Markdown parser with our own parse settings.
- Exporting to WASM with Extism and Protobuf types.
- Generating type-safe FFI bindings with UniFFI.
- Validation functions (such as
Android Application:
- Event List screen:
- Displays a feed of event cards (card consists of title, author, truncated description, and one image).
- Event Details screen:
- Displays all the event details (title, author, full description, up to 10 attached images, location, time).
- Add Event screen:
- Creates an event with the following fields:
- Attached images.
- Title.
- Description.
- Attached tags (if there is no tag for user needs, it can be created).
- Creates an event with the following fields:
- Settings:
- Switches between themes.
Website:
- Event feed page.
- Event details page.
- Event creation page.
- Smart dark mode.
- API query caching.
- Adaptive desktop+mobile layout.
- English and Russian localizations.
Tech Stack #
DevOps:
Our DevOps tech stack is pretty regular for any project. The only thing that
stands out is the use of git-cliff to automate the generation of changelogs.
- Docker, Docker Compose: containerization of services and connecting them with each other.
- **
git-cliff**: Markdown changelog generator. - Ubuntu Server: server based on Ubuntu for deploying the project.
- GitHub Actions: CI/CD workflow.
Machine Learning:
The stack was not modified from the very beginning. The only thing that was added is YAKE that helped us to determine the initial set of tags based on the “Opportunities For You” Telegram channel.
- Python: primary language for ML development
- PyTorch: deep learning framework for Zero-Shot classification
- Transformers / Sentence-Transformers: NLP models for embeddings and text representation
- YAKE: keyword extraction
- Scikit-learn: model evaluation and metrics calculation
- Pandas: data processing and manipulation
- NumPy: numerical operations and array processing
- Jupyter: interactive notebooks for code experiments and sharing results.
These technologies were selected for their proven capabilities in NLP tasks. The main advantages include extensive pre-trained models and strong community support. The only trade-offs were higher memory requirements for transformer models and the need for GPU acceleration during inference. Overall, the stack delivered maintainable solutions for our classification/embedding tasks.
Back End:
The tech stack for the back end hasn’t changed since the beginning. The only major thing added was an object storage.
- Rust: primary programming language.
- Axum: REST web-framework.
- Tonic: gRPC web-framework.
- Diesel: type-safe ORM.
- PostgreSQL: the most popular DBMS.
- MinIO: S3-compatible object storage.
These technologies proved themselves suitable for large-scale development. We’re left satisfied choosing them. The only cons were long compile times and long (but routine) development cycles. Though, when finishing refactors, we were confident that we hadn’t broken anything. The type system and development tooling have been very helpful.
Android Application:
The Android tech stack has not significantly changed from the initial plan. The only changes are related to data storage: the application only uses the storage for settings and does not utilize a database to cache the event list because it may be frequently changed between user sessions.
- Kotlin: primary platform programming language.
- Jetpack Compose: UI toolkit.
- Gradle: build system.
- Retrofit: type-safe HTTP client for REST API communication.
- Coil: library providing cached network calls for image retrieval.
- Dagger Hilt: dependency Injection (DI) framework.
- Kotlin Coroutines: Kotlin asynchronous programming tool.
- Jetpack Navigation: type-safe navigation library.
- Preferences DataStore: settings key-value storage, providing flow access to data.
Website:
We decided to change the stack of our website to make development cycles faster and reduce complexity of the project. The main change was moving from Next.js to TanStack Router.
- TypeScript: primary programming language.
- React: UI framework.
- TanStack Router: type-safe URL router.
- TanStack Query: API handling library with data caching.
- Vite: code bundler and builder.
- pnpm: fast package manager.
- Tailwind CSS: styling framework.
- daisyUI: Tailwind CSS UI framework.
- Connect RPC: type-safe gRPC client.
- react-i18next: React-specific port of the i18next localization library.
Setup Instructions #
Prerequisites: we assume, you don’t have any Docker volumes or build cache that
may collide with our application. Also, we expose ports 3000, 5432, 8080,
9000, and 9090.
- Clone the repository and enter its directory:
git clone --recurse-submodules https://github.com/IU-Capstone-Project-2025/evops.git cd evops/
Set up the
.env,backend/.env,ml/.env, andwebsite/.envfiles:cp .env.example .env cp backend/.env.example backend/.env cp ml/.env.example ml/.env cp website/.env.example website/.envRun the app with Docker Compose:
docker compose up --build
The website should then be available on http://localhost:3000.
The back end should also be accessible on http://localhost:8080.
Note that service communication is assumed to take place on your local machine via the HTTP protocol. Web-browsers may apply CORS restrictions. Make sure your browser settings don’t interfere (you may want to use an extension such as CORS Unblock).
Presentation Draft #
Right here. 😁
Weekly Commitments #
Individual Contribution of Each Participant #
Aleksandr Isupov #
- Integrated tag attachment and creation functionality ( commit).
- Updated the Add Event screen design ( commit).
- Integrated pagination ( commit).
- Fixed a bug that caused multiple images to be deleted by a single URI ( commit).
- Added descriptions to event list cards ( commit).
- Started working on the Settings screen ( branch).
Arsen Galiev #
- Migrated from SSR Next.js to Vite + default React with CSR ( commit)
- Complete integration with TanStack Query for data caching ( issue)
- Add multiple image uploads for an event ( issue)
- Update adaptive layout bugs ( commit)
- Pagination ( issue)
Asqar Arslanov #
- Fixed the WASM build of the client extension ( commit 1, commit 2).
- Fixed image uploading to the back end not being atomic ( commit).
- Designed new API endpoints with Egor ( PR).
- Helped Arsen migrate the website from Next.js to TanStack Router
(
commit).
- Connected the API extension.
- Configured i18n to be type-safe.
- Wrote a Markdown renderer for the website ( commit).
Egor Pustovoytenko #
- Worked on API endpoints (we used Zed collab for it, so not my commit ( PR)).
- Work in progress on implementing the business logic ( commit).
- Created draft presentation.
Ilya-Linh Nguen #
- Added a CI workflow for the Android app ( commit).
- Published a a new Android release ( release).
- Bought a domain for the server, started setting up nginx on it
Maksim Ilin #
- Reworked the fake data uploading process and contents
(
PR,
commit)
- Refactor the event-creating function and the event code structure.
- Added meaningful (more or less) titles for events (a language model approach).
- Created a service class for the event description embedding creation ( commit).
- Issued the tags as they become available ( commit).
Ramil Shakirzyanov #
- Tested ArgosTranslate-based NMT approach ( commit).
- Tested LLM-based NMT approach ( commit).
- Switched the auto-tagger model to half-precision ( commit).
Plan for Next Week #
DevOps #
- Finish domain setup.
Machine Learning #
- Implement the machine translation service class.
- Review the models’ work.
Back End #
- Implement the new endpoints.
Android #
- Update the Create Event screen to include new fields: location, date & time (depends on the back end).
- Integrate new fields into the Event Details screen (depends on the back end).
- Implement functional search on the Event List screen (depends on the back end).
- Add form validation to the Event List screen.
Website #
- Add a PWA.
- Implement event searching.
- Integrate the ML capabilities.
- Improve the layout.
Confirmation of the Code’s Operability #
We confirm that the code in the main branch:
- Is in working condition.
- Runs via Docker Compose.