Inspiration

Small business owners can benefit significantly from AI, yet are hesitant to adopt it. They often don’t have the time or expertise to learn the latest tools and meaningfully integrate them into their own business. Brass Tacks was built around a simple idea: what if AI just worked for you overnight, and you woke up to it being done? The agents observe the market, find revenue opportunities, and do the work for the owner. The owner's only job is to say "do it" or "pass." The goal of Brass Tacks is to make it easy for small business owners to improve their business with AI, without having to put in extra hours or effort.

What it does

Brass Tacks is a team of agents that works overnight for small businesses. The radar agent uses a search API to observe customer reviews, competitor prices, and local demand signals. Everything it finds is cleaned, deduplicated by content hash, embedded, and written into a Cockroach Database. The analyst agent searches that accumulated memory and uses relevant evidence to curate concrete recommendations to increase revenue, each with a dollar figure and a date attached. A maker agent does the actual work that the analyst recommends. When the owner approves a move, the maker agent will draft the actual deliverable, whether it’s a menu card, a reply to a customer, or a social media post. After some time has passed, a meter agent reads previously approved recommendations and compares the predicted revenue growth with what actually happened, judging the quality of the analyst’s decision making. This allows the agents to learn from mistakes and improve over time.

At any time, the user can ask questions about decisions or recommendations that the agents made through a chatbot interface. Cockroach DB’s MCP server is used to query the live cluster so that responses are grounded in real data that was stored in the memory layer. Additionally, BrassTacks handles the supply side of the business, allowing the owner to automate supply orders by simply asking via the chat interface. Orders are placed via Zinc API and agents can also email sales reps that the owner works with to purchase produce.

Finally, BrassTacks tracks the growth that occurred because of its recommendations. Each approved recommendation is stored with a set date for grading. The user can add an approximation of revenue gained because of a move the agents suggested, and that data is used to grade recommendations and help the agents learn from their mistakes.

How we built it

Brass Tacks is built with CockroachDB as the memory layer and AWS as the runtime. Every night, the agents collect market observations, reviews, competitor prices, and local trends. These facts are embedded into vectors using Amazon Bedrock's Titan model, then stored in CockroachDB with distributed vector indexing. This is what gives the system memory. The Analyst agent can search past observations by meaning and use relevant evidence to curate recommendations for the business. When an owner asks a question, the Ask agent answers by querying the live CockroachDB cluster through its Cloud Managed MCP Server. Claude runs read-only SQL directly against the database and returns both the answer and the queries it ran.

The backend runs entirely on AWS Lambda, using 17 serverless functions sharing a single container image, with no servers to manage. EventBridge triggers the nightly agent loop automatically, API Gateway handles owner interactions, and S3 stores both the Maker agent's drafted deliverables and the static frontend served through CloudFront. The architecture is designed so that every piece is load-bearing: Bedrock generates the vectors, CockroachDB remembers and retrieves them, and Lambda runs the agents that tie it all together.

Challenges we ran into

One challenge we ran into was that the evidence found by the radar agent was often an inaccurate reflection of existing issues. What we found was that the agent was reading from closed storefronts. The nightly schedule originally fired at 06:00 a.m. That resulted in every observation being captured while the business was shut. "Not available right now" reached the Analyst as an outage, and it published a find based on that misreading. We moved the run to middday, inside active hours for a restaurant, a shop and a salon alike. The owner still wakes up to finished work, but the evidence collection occurs while the business runs.

Another challenge occurred because the first verification gate we built went overboard and prevented the Analyst from making recommendations. We built a claim-standards check to stop the Analyst from overstating what its evidence supported. It was too strict and nine out of nine real finds were withheld and the owner's recommendation board was empty. An empty board is not a safe board, but a broken one. So we modified it to demote rather than reject, walking the claim down a ladder from "current state" to "pattern" to "opportunity" until it reaches a tier the evidence actually supports, and only withhold if nothing fits.

What we learned

We learned that embeddings reward concrete questions and punish abstract ones. Strategic-sounding queries are exactly the wrong thing to ask a vector index. Instead, hypothesis-shaped ones work. We found this out by actually measuring the difference in the semantic similarity scores when using abstract queries and specific concrete hypotheses. This allowed us to improve the Analyst agent's ability to retrieve relevant evidence that it can use to inform its observations.

What's next for BrassTacks

The next step is to integrate cost estimates into every recommendation. It is built and thoroughly tested and is a feature that adds costs beside what a move earns, and its prompt deliberately cannot see the revenue figure so cost can never be biased by the payoff. It runs today only when passed in explicitly. Wiring it into the deployed nightly run means every recommendation arrives with a payback period rather than gross revenue alone, which will expose the finds worth $23 a day that take forty days to break even.

Built With

Share this project:

Updates

Submission history