← All work

Frie

Diners get food recommendations and diet plans inside a social delivery app

Frie is an Uber Eats style app that joins social food discovery with ordering and delivery, plus a driver app. We built the back end and apps, kept scope visible while designs changed, and added machine learning for dish recommendations and diet plans.

Real Estate & HospitalitySocial food ordering appsBuilt from zero

Diners search Frie, filter by cuisine and diet, and see a restaurant of the day and trending picks on the home screen.

The challenge

Frie needed a social network for food and a full ordering service to work as one product, while its designs kept changing between versions.

What we did

We built one documented API for the customer and driver apps, added recommendations and diet plans, and compared every changed screen to keep scope visible.

The outcome

Frie received a working back end, an Android app with full ordering and a driver app, with a written status for every feature.

What shipped
Django back end, Android customer app, driver app
For diners
Dish recommendations and personal diet plans
Social and ordering
Food albums, feeds, reviews, recurring orders, rewards
Scope control
Screen by screen design change reports

The starting point

Frie is a U.S. food app startup. Its product joins a social network for food lovers with restaurant delivery and pickup, plus a driver app that fulfills orders.

What had to change

Social discovery and ordering had to work as one product, with one back end serving the customer apps and the driver app. Frie's designers produced the screens and kept refining them.

What could not break

  • Designs kept changing between Zeplin and Figma versions, with no change notices
  • Android, iOS and driver apps all run on one back end and one API
  • Social features and ordering share one diner account and profile

The calls we made

We treated changing designs as a scope problem to make visible, not a reason to stop building.

  1. 01

    Separate tracks on one API

    We split the work into a Django back end, native Android and iOS customer apps and a driver app, so each track could move in sprints against one documented API.

  2. 02

    Compare every design version

    When designs changed, we compared each screen across Zeplin and Figma versions and documented the differences, and listed flows that still had no design, so Frie could see what a change meant for scope.

  3. 03

    Estimate the driver app in full

    We made a new, more complete estimate for the driver app and compared it with an earlier, shorter one before setting its timeline.

    Ruled out

    Carrying over a previous developer's shorter estimate.

  4. 04

    A written status by feature

    We kept a feature list marking each item as complete, in progress or pending, so the founder always knew what was ready.

How the system fits together

discover andorderdelivery areasdiner datapicks and plansasync jobshome screenreads andwritescard paymentmapsDinersAndroid and iOS customerappsDriversDriver appDjango REST APISocial, ordering, rewards;Swagger docsRecommendations anddiet plansMachine learning for eachdinerBackground jobsCelery workers on RabbitMQHome screen cacheRedisApp dataProfiles, albums, menus,dietary dataCard paymentsOrder checkoutGoogle MapsMaps in the customer apps
PeopleBuilt by DaticsAI modelData storeOutside serviceEvery app talks to one documented Django API, which serves social features, ordering, recommendations and diet plans.

What we built

01

Food recommendations

Machine learning recommends dishes to each diner inside the app, next to search, dietary filters and friends' food albums.

02

Diet plans

Diners get diet plans built into the same app they order from, so what they plan and what they order stay in one place.

03

Social and ordering back end

Profiles with privacy levels, follow and block, reporting, bookmarks, search with filters, restaurant profiles, events, food albums, a filtered news feed, reviews, one time and recurring orders, promo codes, card payment, rewards and dietary data, with Redis caching on the home screen.

04

Android customer app

Search and filters, bookmarks, album details, restaurant feeds and profiles, full order placement with new addresses and payment methods, followers, and review posting and reporting.

How it works

Discover

A diner browses friends' food albums, restaurant feeds and reviews, or searches with dietary filters.

Order

The diner places a delivery or pickup order, one time or recurring, with a promo code if they have one.

Pay

The order is paid by card and earns rewards.

Deliver

A driver in the matching delivery area picks up the order in the driver app.

What changed

Frie received a working back end, an Android customer app with full ordering and a driver app, with a clear list of what was complete and what was still to come. Design changes were documented screen by screen instead of surfacing as surprises.

Under the hood

Datics role
Product built by Datics
Back end
Django REST API documented in Swagger, with Celery job queues on RabbitMQ and Redis caching.
Deployment
Django behind Gunicorn on an Ubuntu server, deployed by pulling the latest commit and restarting.
Integrations
Card payments and Google Maps, with Twilio SMS planned for order confirmations and password resets.

Data and retrieval

Redis

Apps and APIs

PythonDjango REST

Also in the stack

CeleryRabbitMQNative AndroidiOSGoogle Maps

How it shipped

  1. Data science first

    Before the app build, we worked with the same founder on machine learning scoring and recommendation systems.

  2. Back end and Android

    We built the Django back end and the Android customer app first, from profiles and food albums to full order placement.

  3. iOS and driver app

    An iOS team joined on the same API, and we estimated and started the driver app for sign up, profiles, delivery areas and activities.

  4. Design changes and depth

    We compared the new Figma screens with the Zeplin versions, then added recurring orders, Google Maps and home screen caching.

  5. Documents

    We wrote architecture, API and deployment documents, with Swagger API docs, for whoever runs the system next.

Sprints in Redmine

Every task was tracked in sprints in Redmine, with a feature by feature status the founder could review at any time.

Documents for the next owner

We handed over architecture, API and deployment documents, with Swagger API docs, so whoever runs the system next can pick it up.

What this unlocked

Group orders, reservations, SMS notifications, gift cards and wallet payments were the next items on the feature list.

Have a product with the same kind of constraints?

Tell us what already exists and what you want it to do. We will tell you what it takes.

Book a 30-minute Product Review