Academic

TheSpoon — An Android App for Finding Recipes

An Android app in Kotlin and Jetpack Compose, built as a two-person project, to search for recipes through a remote API, with a local Room cache.

Completed

My contribution

I built the whole technical side of the app: the Jetpack Compose interface, state management, API calls, search, navigation, the recipe page and local persistence with Room. My teammate took care of the documentation and the presentation material.

Highlights

  • Interface built entirely with Jetpack Compose, from the splash screen to the recipe page
  • Recipe search through the Food2Fork API, with quick keyword filters
  • Retrieved recipes stored in a local Room database

Goal

Build an Android app to search for cooking recipes, powered by a real remote API, Food2Fork, and able to keep the recipes already viewed on the device.

Architecture

The app, written in Kotlin, relies on a single Activity and an interface built entirely with Jetpack Compose and Material 3. Navigation links three screens: a splash screen, the home screen with search and results, and a recipe page. The UI state is centralized in a ViewModel exposing StateFlows; network calls and database access run in coroutines. HTTP requests go through Ktor, JSON responses are decoded with kotlinx.serialization and images are loaded with Coil.

Features

  • Search for recipes by title.
  • Quick filters: a few predefined keywords (pasta, chicken, desserts…) that start a new search.
  • Results list with image and title, leading to each recipe’s page.
  • Recipe page: image, title, ingredients, last update date and publisher.

Local cache

Every retrieved recipe is stored in a local Room database, inserted or replaced if it already exists. The app can read back a recipe by its identifier or a set of recipes, and this cache also feeds the display when the remote call fails.

Limits

The project remained an academic prototype. Pagination and some features planned in the documentation were not completed, and the local cache is a partial fallback rather than a true offline mode.