गंतव्य
Palette
Mode
Motion

Calm stops smooth scrolling, moving art and the story’s music, and keeps everything still.

गंतव्य
Palette
Mode
Motion

Calm stops smooth scrolling, moving art and the story’s music, and keeps everything still.

All work

AI & agents · 2026in progress

Stuti

A desktop assistant with memory and web search — on its way to an agent that can talk, and act with your permission.

Role
Design and build
When
2026
Stack
Python · Gemini 2.5 Flash · Google Search grounding · SQLite · Tkinter
Links
Source
The problem

Why it needed to exist.

Most assistants forget you when the tab closes, and can’t touch the machine they run on. Stuti starts from the other end: it lives on your computer and remembers — and it is being built to do things there, carefully.

A personal assistant that lives on the desktop: a small Tkinter app, Gemini 2.5 Flash with Google Search grounding, and a local SQLite memory of past conversations. Next, it learns to listen and speak, to know your own files, and to act on the computer — only with your say-so.

Constraints

  • Runs on an ordinary laptop: one setup script builds its environment and checks its imports.
  • Memory stays local — a SQLite file you can open and read.
  • Anything it will do on the computer must be shown and approved first. Never silent.
The system

How Stuti answers — and where it’s going

Today: you type in a desktop app; a Gemini 2.5 Flash engine answers with the last twenty messages from local SQLite memory as context, grounds replies in Google Search when needed, and saves both sides. Next: voice, retrieval over your own files, and desktop actions behind a permission gate.

How Stuti answers — and where it’s goingToday: you type in a desktop app; a Gemini 2.5 Flash engine answers with the last twenty messages from local SQLite memory as context, grounds replies in Google Search when needed, and saves both sides. Next: voice, retrieval over your own files, and desktop actions behind a permission gate. Not built yet: Voice (planned), Knowledge (planned), Permission (planned), Desktop actions (planned).messagereplylast 20savedif neededapprovedDesktop appTkinterVoicespeech in · outMemorySQLite · messagesKnowledgeRAG · your filesGemini2.5 FlashWeb searchGoogle groundingPermissionasks firstDesktop actionsapps · files
builtnot built yet
  1. Today you type into a small desktop app. Next: speak to it, and hear it answer.

  2. The last twenty messages come back from local SQLite when it starts. Next: retrieval over your own notes and files.

  3. Gemini 2.5 Flash answers, and both sides of the exchange are saved back to memory.

  4. When a question needs fresh facts, the reply is grounded in Google Search.

  5. plannedEvery action on the computer — opening an app, moving a file — is shown to you and approved before it runs.

In use

What it looks like.

  • IllustrationThe desktop window, drawn from gui.py — the messages are examples.
  • The Stuti source repository on GitHub: file list and README.
    Stuti, in the open on GitHub. · captured Sep 2026 from github.com/bgantavya/stuti.ai
Decisions

Three choices, and what each one cost.

  1. 01

    SQLite as memory

    Every message is saved to one local file, and the most recent twenty come back as context when the app starts: stored locally, inspectable, zero setup — though the conversation itself still goes to Gemini.

    Trade-offTwenty messages is a window, not understanding — retrieval over past conversations and files is next.

  2. 02

    Grounding instead of a search tool

    Gemini’s built-in Google Search grounding decides when a question needs fresh facts, so there is no search step to orchestrate. A DuckDuckGo tool was written, then set aside.

    Trade-offOne provider’s search, on that provider’s terms.

  3. 03

    Permission before power

    An assistant that can act on the computer must never surprise you, so every action will pass a gate that shows exactly what will happen and waits for a yes.

    Trade-offMore clicks than a fully autonomous agent — deliberately.

Outcomes

What changed.

past messages reloaded when it starts
20
load_history(limit=20) in memoryDB.py, passed to the chat session as history.
memory — one SQLite file on your machine
Local
its public cousin, on this site
“stu”
The site assistant also runs on Gemini, with its own tools and no memory.
What I’d do next

The next version.

Voice in and out, retrieval over your own notes and files, and desktop automation — each action shown and approved before it runs.

Something like this on your plate? Write to me.