DEV Community

Amey Sunu
Amey Sunu

Posted on • Edited on

CloudStroll - Redis Challenge

Redis AI Challenge: Real-Time AI Innovators

This is a submission for the Redis AI Challenge: Real-Time AI Innovators.

What I Built

CloudStroll is a travel-journaling app that captures every moment of your trip—location, text notes, mood, weather, and makes them instantly searchable, mappable, and analyzable in real time.

  • Create & Store Memories Each memory is saved as a RedisJSON document with fields for location, entry, mood, weather, timestamp, uid and an embedding vector.
  • Tag & Full-Text Search Instantly filter by mood or keyword with RediSearch’s TAG and TEXT indexes.
  • Geo-Search & Map View Geo-index every entry so you can find things “within 5 km of me” or pan/zoom on an interactive map.
  • Semantic Search You can turn your search (ex: "hot sun") into an embedding and run a KNN vector search to retrieve memories that talk about beaches, coastlines, or sunsets—even if they never explicitly say "beach"
  • Mood Trends Stream mood counts into RedisTimeSeries and display beautiful charts to show how your emotional journey evolved over time.

All of this is powered by a single Redis 8 deployment—no separate cache, search engine, or time-series database.

Demo

Github - https://github.com/ameysunu/cloudstroll-redishack
YouTube - https://youtu.be/A5UaeEVElyg

How I Used Redis 8

1. RedisJSON

  • Storage: Each memory as a JSON doc under memory:<id>.
  • Updates: After computing embeddings, I update the vector field:
  JSON.SET memory:<id> $.embedding "<json-array-of-floats>"
Enter fullscreen mode Exit fullscreen mode

2. RediSearch V8

I created a unified JSON index for tags, text, and vectors:

FT.CREATE memory-idx ON JSON PREFIX 1 "memory:" SCHEMA \
  $.uid       AS uid     TAG \
  $.mood      AS mood    TAG \
  $.entry     AS entry   TEXT \
  $.embedding AS vec     VECTOR FLAT 6 \
    TYPE FLOAT32 DIM 384 DISTANCE_METRIC COSINE

Enter fullscreen mode Exit fullscreen mode

TAG Queries

FT.SEARCH memory-idx "@mood:{happy}"
Enter fullscreen mode Exit fullscreen mode

TEXT Queries

FT.SEARCH memory-idx "@entry:beach"
Enter fullscreen mode Exit fullscreen mode

KNN Vector Queries

FT.SEARCH memory-idx "* => [KNN 5 @vec $BLOB]" DIALECT 2 \
  PARAMS 2 BLOB <binary-blob> \
  RETURN 1 "$" LIMIT 0 5
Enter fullscreen mode Exit fullscreen mode

3. RedisTimeSeries

  • Track per-mood counts in real time
TS.CREATE mood:trend:<mood> RETENTION 0 LABELS mood <mood>
TS.ADD   mood:trend:<mood> * 1
Enter fullscreen mode Exit fullscreen mode
  • Power the trend chart after
TS.RANGE mood:trend:happy 2025-07-01 2025-08-07
Enter fullscreen mode Exit fullscreen mode

4. GeoIndexing

Each memory is geo-indexed for location search

GEOADD memory:geo <lon> <lat> memory:<id>
GEOSEARCH memory:geo FROMLONLAT <lon> <lat> BYRADIUS 5 km
Enter fullscreen mode Exit fullscreen mode

5. RealTime AI Flows

Semantic Search: External embedding service to store vector in RedisJSON FT.SEARCH KNN on @vec to find semantically similar memories.

Stack

  • Frontend - I used SwiftUI to build the mobile app for iOS.
  • Backend - I built the backend with Go, and hosted it on Google Cloud Run
  • Misc - Google Cloud, Redis (of course), Firebase Auth, Hugging Face (for generating embedding)

Architecture

Screenshots

Notes

To build the app, clone the code, build it using Xcode. For Secrets.xcconfig, please email me privately, and I'll send that over. Install this onto a simulator or an actual device for testing. For any bugs encountered, please feel free to open an Issue and raise a PR on my Git Repo

Top comments (0)