← All work

ArtCenter

An Android app for artistic disciplines: a browsable catalogue of techniques wrapped around a social feed where artists post their own work.

Role
Final degree project · Android app & REST API
Year
2025
Stack
Kotlin · Jetpack Compose · MVVM · Hilt · Python · Flask · JWT · MySQL · Cloudinary
Status
Shipped Delivered June 2025

Problem

Learning an artistic technique and showing the results are usually two different places on the internet: a reference site that explains what etching is, and a social network where nobody explains anything. I wanted one app where the catalogue and the community sit next to each other, so the thing you just read about is the thing you can immediately see other people doing.

As a final degree project it also had to be built end to end, so consuming someone else’s API and calling it a system was not an option.

Solution

The client is native Android in Kotlin: Jetpack Compose with Material 3, MVVM with one ViewModel per screen exposing a StateFlow and a sealed UiState, Hilt for dependency injection, Retrofit over OkHttp for the network layer, and Coil for images.

The API is Python and Flask with raw SQL over PyMySQL (no ORM) against MySQL 8, with authentication by JWT, image hosting on Cloudinary, and the whole surface documented with OpenAPI 3 and served through Swagger UI.

Three decisions took most of the work:

  • Pagination on scroll. The API returns the feed in pages of twenty. On the client, FeedScreen watches the grid’s layoutInfo with snapshotFlow and requests the next page as the last visible item approaches the end, so the user never has to notice a page boundary. Most of the work went into the guard, since snapshotFlow emits far more often than pages need loading.
  • A single publication component. The same card appears in the feed, the profile and search results, with a different context menu in each: a stranger’s post can be liked and saved, your own can also be deleted, and an administrator can delete any of them. It takes userRole and isOwner and decides for itself, so the permission rule lives in one file rather than three.
  • Likes and saves resolved in one query. Whether the current user has liked or saved each post comes back with the feed itself, through a LEFT JOIN against the relationship tables, instead of one follow-up request per card.

Result

A working system: registration and login, user and administrator roles carried in the token, a paginated feed, tagged posts, likes, saves, comments, search, profile management, and an administration panel for the discipline catalogue.

Both repositories are documented with full READMEs, and the app repository includes recorded walkthroughs of the user and administrator flows. The backend is not deployed: it runs locally against MySQL, and the client points at it by configuration.