Inspiration
Lambodaran (ലമ്പോദരൻ), Ganesha, is the deity of intellect, memory, and the removal of obstacles. Mooshik (മൂഷികൻ) is his companion and vahana, the mount that carries him into the world. The Sanskrit root mūṣ means to extract, to gather, to scurry away with.
That is the architecture, not a coat of paint. Lambo is the vast, heavy memory. Mooshik is the small fast thing that carries it, moves through your workspace, and acts.
We built it because every assistant we used was amnesiac in one of two ways. Coding agents are contractors: you summon one, it edits a repository, it exits, and it remembers nothing. Chatbots hold a conversation and forget the work. Neither knows what you decided three weeks ago, so you re-explain your own project to your own tools, every day.
The obstacle is not intelligence. It is memory.
What it does
Mooshik runs in a terminal pane beside your editor. It watches the workspace you launched it from, answers questions from a graph of what you have built and decided, researches the web, reads screenshots and audio, and hands heavy code changes to a coding agent rather than pretending to be one.
Ambient is positional, not configured. cd is the configuration. And the watcher records that a file changed, never what it says: the concept written is workspace file changed: notes.md plus a timestamp, and the file's text never enters it. Contents are read once, as a gate, to decide whether to stay silent. Repositories are metadata-only sources, so when the walk meets a .git directory it records HEAD and does not descend.
How we built it
One Rust binary links lambo::Memory in process. Below the GraphStore seam sits Cloud SQL Postgres with pgvector, so a desktop and a laptop share one memory. Inference and embeddings run on Vertex AI. A bootstrap ingester, written as a Google ADK agent and deployed as a Cloud Run Job, read this machine's development history and had Gemini Flash extract concepts at volume, writing them through lambo serve as the single writer.
Importance is not asserted by an agent. Lambo rescores every concept from structure alone, on a loop no agent can call:
$$ S(c) = 0.25\,R + 0.20\,F + 0.20\,A + 0.35\,D + \sum_{e \in E(c)} b(\tau(e)) + m(\tau(c)) $$
Recency, frequency, session activity, and density. Only promoted concepts become load-bearing, surfaced as a warning before you touch something they constrain.
Secrets are not filtered out of the graph. They are never in it. The graph is queryable, embedded, synced, and readable by models. The vault is encrypted, local only, never synced, never embedded. Values resolve at the moment of use and are injected into tools, never into a model's context, and tool output is scanned before it reaches the model, because output is where a secret actually escapes.
Challenges we ran into
Two values that look like they should agree and must not. Inference runs at Vertex location global, because that is the only place Gemini 3.x is served. Embedding runs at us-central1, because gemini-embedding-001 lives in the region. Tidying them into agreement breaks one or the other.
The same model, two names. Vertex's OpenAI-compatible endpoint addresses models by publisher and needs google/gemini-3.7-flash. The Python components go through google-genai and reject that exact string. The model id had been written out longhand in six places, and it drifted, and guided setup shipped briefly with a config that failed its own verification step.
Credentials a careful user does not have. First-run asked for a downloaded service-account key. Anyone who followed Google's own advice has a gcloud login and no key file. Worse, the credential chain resolved file paths only and never discovered ADC, so the correct user was the one who could not start.
A single line of process plumbing. MCP servers were spawned with inherited stderr. Python's logging then wrote straight to the terminal while the TUI was drawing, landing inside other panes and inside the input box. It survived the entire test suite, because nothing in it runs a real child that logs against a real terminal.
What we learned
Ship it to yourself first. Every defect above was found by running the product on a clean machine, not by reading the code. The test suite was green through all of them.
And a filter that promotes nothing has perfect precision and no value. Reporting what canonization wrongly rejected, not only what it correctly rejected, is what turned a plumbing exercise into a finding.
Built With
- gemini
- gemini-3.7-flash
- google-agent-development-kit
- google-cloud
- google-cloud-run
- google-cloud-sql
- google-vertex-ai
- graph-memory
- lambo
- mcp
- model-context-protocol
- multimodal
- pgvector
- postgresql
- python
- ratatui
- rust
- vector-search

Log in or sign up for Devpost to join the conversation.