Inspiration
A small business owner might want to raise prices, introduce a product, or try a new promotion. Each decision costs money, and finding out how customers will react can require surveys, research, or an expensive trial.
I built Vey to help owners explore those decisions earlier. The idea is simple: ask a simulated version of your local community before committing money in the real world.
What it does
Vey creates synthetic residents using US Census data and lets you ask how they might respond to a business decision.
A café owner could ask, “What might happen if I raise coffee prices by $1?” They can explore the simulated response and compare reactions across groups such as age, income, and education.
The residents appear as moving characters on an interactive city map. You can explore individual personas, compare options, and revisit saved questions and results.
Vey provides an early signal for deciding what to investigate next. Its responses are simulated estimates, not measured customer demand.
How I built it
I built the backend in Rust with Axum and the frontend with JavaScript, HTML, and CSS. The map uses HTML Canvas to render thousands of resident sprites.
Resident demographics come from US Census Public Use Microdata Sample data. Gemini generates simulated responses, which are combined using population weights so different groups contribute appropriately to the overall estimate.
SQLite stores simulation state, and Neo4j supports persistent memory. The frontend runs on Vercel and connects to a backend hosted on Railway.
Challenges I faced
One challenge was keeping thousands of residents moving while the app remained responsive. I worked on shared simulation updates, bounded pathfinding, and map-rendering performance.
Another was preserving saved work across sessions and keeping browser workspaces separate. That required checking persistence, workspace access, and recovery after restarts.
I also had to make the results understandable without making them sound more certain than they are. Showing group differences and explaining the limits of synthetic responses became an important part of the design.
What I learned
I learned that a useful simulation needs more than an AI-generated answer. The population behind it, the way responses are weighted, and the way uncertainty is communicated all affect how someone interprets the result.
I also learned to test the complete path from a browser action through the API and database to the result on screen.
What's next
I want to work with small business owners to identify their most frequent decisions and compare Vey’s estimates with real customer feedback. That would help establish where synthetic residents are useful and where the approach needs improvement.