Inspiration
As students, we’re constantly juggling indecision, stress, and FOMO. The last place you want to feel that is in your free time. We often found ourselves craving the bar experience but couldn’t line up schedules, afford going out, or even decide where to go. Staying home wasn’t much better: endless recipe websites, conflicting advice, and 30+ minutes of scrolling just to feel more lost. On top of that, mixology is intimidating if you’re a complete beginner without a guide. For these reasons, we built Barline.
What it does
Barline is a neon, digital bar that lives on your screen. Instead of dumping a giant list of recipes on you, your Barline bartender, Arthur, listens to your sentiments and decides for you.
- You talk to Arthur through a chatbox on the left side of the screen.
- Based on your mood, constraints, and preferences, Arthur selects a cocktail recipe that best fits your criteria.
- The chosen recipe appears on the right in the Recipe tab, where you can see ingredients and steps.
- A 3D interactive image of the cocktail appears in the middle bar scene so it actually feels like you’re at the bar.
How we built it
Behind the scenes, Arthur is supported by an LLM and a Supabase database containing tables for cocktails, ingredients, garnishes, and SAQ product data.
- We reverse-engineered and ingested the GraphQL API used on the SAQ website to pull product data.
- These tables are embedded into vectors using Gemini, and stored in dedicated embedding tables.
- At query time we:
- Embed the user’s message,
- Retrieve the most relevant rows from our embedding tables,
- Feed those into the LLM as context in our RAG framework, so Arthur can make a smart choice and explain it. On the frontend, we use three.js to render and animate the bar scene, glass models, liquid, ice, and garnishes, along with a character model for Arthur behind the bar.
Challenges we ran into
The main challenges we encountered were around embeddings and RAG visibility:
- Our embeddings initially suffered from formatting and schema issues, including dimension mismatches and missing metadata, which meant the content text we needed for RAG was inaccessible.
- We fixed this by adding dedicated
contentcolumns for embedding text and ensuring the ETL matched the schema correctly. - The RAG framework, while mostly functional, at first could not “see” the data in the embedding tables. This turned out to be a mix of:
- Mismatched relationships (e.g., wrong join table names),
- And Row-Level Security (RLS) policies in Supabase that blocked our backend from reading the embeddings. We resolved this by simplifying the relationships, adjusting our queries, and writing RLS policies that safely allow reading from the embedding tables.
Accomplishments that we’re proud of
We are very proud of:
- Our UI and graphics, including the animated neon bar and interactive cocktail models in three.js.
- Our SAQ scraper algorithm that reverse-engineers their GraphQL API.
- A working, end-to-end RAG framework that actually chooses drinks based on user mood, not just keywords.
- Combining all the moving parts into a cohesive experience
What we learned
Through this process, we learned:
- How to design and implement a RAG framework in practice.
- How to work with and animate assets in three.js.
- How to structure a database for vector embeddings and similarity search.
- How to prompt an LLM for persona-based chatbot behaviour (Arthur as a bartender who decides for you, not just answers questions).
- How to debug “invisible” issues like RLS blocking data, schema cache problems, and embedding dimension mismatches.
What’s next for Barline
Barline could be scaled significantly in the future. Some directions we’re excited about:
- History and personalization so Arthur remembers your favourite drinks and past sessions.
- Multiple bartenders, each with a different specialty and vibe
- More data sources: integrating other liquor boards and storefronts for non-alcoholic ingredients.
- Partnerships and monetization via deep linking to purchase pages, affiliate partnerships, or curated bundles.
- Turning Barline into a subscription-based service, similar to Netflix or Spotify but for personalized drink discovery and curation.
Barline started as our way to escape decision fatigue around “What should we drink tonight?” and turned into a fully interactive, AI-powered digital bar experience.
Built With
- docker
- gemini-api
- python
- rag
- react
- sql
- supabase
- taml
- typescript
- yaml
Log in or sign up for Devpost to join the conversation.