Week #6

Week #6 #

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 .env file.
  • An API extension for clients to ease the interaction with our back end:
    • Validation functions (such as validate_event_title or validate_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.

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).
  • 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.

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.

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.

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.

  1. Clone the repository and enter its directory:
  • git clone --recurse-submodules https://github.com/IU-Capstone-Project-2025/evops.git
    
    cd evops/
    
  1. Set up the .env, backend/.env, ml/.env, and website/.env files:

    cp .env.example .env
    cp backend/.env.example backend/.env
    cp ml/.env.example ml/.env
    cp website/.env.example website/.env
    
  2. Run 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).
  • 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.