Back to selected work

Privacy-first AI

Astro AI

An AI astrologer where the personal parts — birth details and past conversations — stay in the browser. A separate FastAPI service handles inference and keeps nothing about the user.

ReactTypeScriptFastAPITailwind CSS
Astro AI screenshot

Notes from the build

The challenge

The data that makes the product personal — birth date, time, and place — is also the input the model needs. Keeping that data in the browser while still getting a useful reply was the main constraint. The interface also had to hold multiple saved profiles and chat sessions without a backend to keep state.

How I solved it

  • Birth profiles and chats live in IndexedDB through Dexie, with separate tables for sessions and messages.
  • Only the details needed for the current reply are sent to the FastAPI backend, which does not store them.
  • Each session keeps its own message list, so reopening an old chat restores it where it left off.
  • react-markdown with remark-gfm renders the model's formatted replies, so the output stays readable.

The experience

  • Users save birth date, time, and place as reusable profiles.
  • Past conversations can be reopened from session-based chat history.
  • Markdown responses, a dark theme, and layouts that hold up on smaller screens.

Local-first data

Chats and birth profiles persist in IndexedDB through Dexie, so they survive refreshes and revisits without an account on the server. The trade-off is that the data lives on one device: clearing browser storage clears the history.

The backend split

The React app talks to a FastAPI backend that calls the Gemini API for each reply. The backend is stateless — it runs inference and returns a response, which keeps the privacy claim simple to hold.

Keep exploring

Other projects

View all work