← All work
AI Integration·2025·LLM-SaaS·Built for a client

An LMS students can talk to, not just click through

lib/actions/companion.action.tsLive
1'use server';
2
3export const createCompanion = async (formData: CreateCompanion) => {
4 const { userId: author } = await auth();
5 const supabase = createSupabaseClient();
6
7 const { data, error } = await supabase
8 .from('companions')
9 .insert({ ...formData, author })
10 .select();
11
12 if (error || !data) {
13 throw new Error(error?.message || 'Failed to create a companion');
14 }
15
16 return data[0];
17}
VoiceAI tutor interaction

Students query grades, courses, and timetables by voice instead of navigating multiple dashboards.

The problem

Students had to dig through separate portals for grades, attendance, and timetables — with no fast way to just ask a question.

Our approach

We built a learning management system where students talk to an AI voice tutor powered by OpenAI and Vapi, and get grades, attendance, and schedules back as natural-language answers.

Behind the build

Voice AI feels natural only when responses are fast enough that users stop thinking about the technology. Combining Vapi with OpenAI while keeping conversations responsive was the biggest technical challenge, and seeing users naturally ask questions instead of navigating menus made the product feel genuinely useful.

— North Foundry, on building this

Built with

Next.jsOpenAIVapiTypeScript

Want something like this?

Next project

Real estate search that doesn't fight the buyer

→