Inspiration

LastMile started from a simple frustration: sometimes finding information online is not enough.

If I need a product, service, appointment, repair, transport, or something else nearby, I can search for it myself. But I may still have to compare places, find phone numbers, call several of them, repeat what I need, ask whether it is available, and then decide what to do next.

I wanted to remove that last mile between knowing what I need and actually getting it done.

That became Miles.

The idea is simple: I should be able to say what I need once, and Miles should take it from there.

What it does

LastMile is a voice-first mobile assistant built around Miles.

A user can wake Miles by saying “Hey Miles” and describe what they need naturally. Miles uses the user's location to find relevant nearby options and presents those results on a live map.

The conversation does not end after the search. The user can continue speaking naturally and explicitly authorize Miles to call a displayed business, for example:

“Call [business name].”

Miles remembers the active search, understands which business the user means, and only places a call after receiving clear authorization.

CALL-E is then used as the real outbound calling layer, receiving the selected destination and the user's original request so it can ask about things such as availability, price, or whether the exact item is available.

The goal is not to make another search app. It is to let someone go from “I need this” to taking real-world action with as little effort as possible.

How we built it

LastMile is a native Android application written in Kotlin.

The app uses Android speech recognition for voice interaction, text-to-speech for Miles' responses, device location for local context, Google Places for real nearby results, and OpenStreetMap for the live map experience.

I also built conversation state into the app so Miles can remember the current results. This allows follow-up commands such as asking for the closest option, selecting one with a phone number, identifying a business by name, or authorizing a call without starting the search again.

CALL-E is integrated as the action layer. Once the user explicitly authorizes a call, LastMile sends the selected destination and the user's original request to CALL-E.

I deliberately separated searching from calling. Finding a result never automatically authorizes a phone call. The user remains in control of when Miles can take that action.

Challenges we ran into

The hardest part was moving from a good demo concept to something that actually works with real services.

Voice conversations are not as simple as sending messages in a chat. Miles has to know when the user is waking it, making a new request, referring to an existing result, cancelling something, or actually giving permission to place a call.

We also ran into a real limitation while testing CALL-E from Kenya. The integration successfully reaches CALL-E, but CALL-E currently rejects an English-language outbound call to a Kenyan recipient number because that region/language combination is not supported by the provider. Rather than simulate a successful call, I kept LastMile connected to the real API and made the limitation visible.

That was important to me because the project is meant to demonstrate real-world action, not a fake phone-call animation.

Accomplishments that we're proud of

I am proud that LastMile became more than a voice interface.

Miles can listen, understand a request, use real location data, find real nearby places, display them geographically, maintain the conversation across follow-up commands, require explicit authorization before calling, and hand the selected request to CALL-E.

I am especially proud of keeping the interaction simple:

Ask once. Miles gets it done.

Behind that sentence are location, search, conversation state, voice recognition, business selection, phone-number validation, user authorization, and the CALL-E integration.

What we learned

One of the biggest lessons was that building an agent that takes action is very different from building one that only gives answers.

Once an assistant can make a real phone call, details such as authorization, cancellation, context, phone-number validity, provider availability, and failure handling become important.

I also learned that real integrations expose problems that a controlled demo never will. Regional calling restrictions were not something I expected to become part of the project, but discovering that limitation through the actual CALL-E API helped make LastMile more realistic.

What's next for LastMile

I want Miles to handle more of the everyday tasks that currently require people to jump between search engines, maps, phone calls, and different apps.

The next steps include expanding the kinds of needs Miles can handle, improving natural multi-step conversations, adding more service integrations, supporting ride and transport handoffs, improving call-result handling, and expanding calling as provider coverage becomes available.

The long-term idea is much bigger than finding nearby places.

I want LastMile to become the layer between a person's need and the services capable of fulfilling it.

You ask once.

Miles gets it done.

Built With

Share this project:

Updates

Submission history