Inspiration
Landing in a new country is paperwork in a language you barely speak, on a deadline you didn't know about, in a city where the bus stops have names you can't pronounce. We've watched family and friends spend their first weeks in Canada juggling tabs on canada.ca, ontario.ca, ircc.gc.ca, three banks, and a settlement-services pamphlet — all in English. The single most expensive mistake newcomers make is missing a window: the 3-month OHIP wait, the SIN appointment, the tax filing deadline. We wanted to build the calm, multilingual friend who already lives here — one you can just talk to, in your language, and who quietly slides the next deadline onto your calendar before you hang up.
What it does
TalkToCanada is a voice-first assistant for newcomers. You pick your language (15 supported, including Arabic, Urdu, Persian with right-to-left rendering), tap the mic, and ask anything about settling in — SIN, health cards, IRCC processes, banking, housing, driver's licenses, taxes, EI, credential recognition. Claude answers in your language at a sixth-grade reading level, then ElevenLabs reads the answer back in a natural voice. The trick: whenever the answer involves an actual appointment or deadline (book your SIN at Service Canada, apply for OHIP on day 91, file taxes by April 30), the response also produces a one-tap "Add to Google Calendar" button — pre-filled with title, date, location, and what to bring. No OAuth, no app store, no account.
How we built it
- Next.js 16 (App Router) + React 19 + TypeScript on the front.
- Tailwind CSS v4 with CSS-first
@themetokens — every color is OKLCH and lives inapp/globals.css; no component contains a stray hex value. - Claude Sonnet 4.6 as the brain, with a system prompt that enforces three things: respond only in the chosen language, never invent fees or dates, and append a fenced
`eventJSON block at the end of the message whenever the answer involves a real deadline. - A small event parser strips those blocks from the displayed prose and turns them into clickable buttons — the user sees clean text plus a calendar chip; they never see the JSON.
- ElevenLabs Multilingual v2 for TTS, with a per-language
voice_idmap so a Punjabi answer doesn't get read in an American accent. - Web Speech API for speech-to-text — entirely in the browser, no audio leaves the device for transcription. Firefox (which doesn't implement it) automatically falls back to a text input.
- Google Calendar without OAuth. Instead of building a Google integration, we build a pre-filled
calendar.google.com/calendar/render?...URL — Google handles the auth and the save in a single click. Zero scopes, zero server state. - No database, no auth. Language choice and the last 10 messages live in
localStorage, so the conversation survives a refresh.
Challenges we ran into
- Keeping Claude in-language was harder than it looked. Early prompts drifted back to English the moment a proper noun like "Service Canada" appeared. We rewrote the system prompt to spell out the rule per sentence ("every sentence, every word, in ${language.name}") and to explicitly allow keeping untranslatable proper nouns inline.
- Mixing prose and machine-readable side effects in one response. We wanted the model to both speak naturally and emit a structured calendar event, without breaking either. The solution was a fenced
`eventJSON block at the very end, parsed out before the text is shown or sent to TTS — so the user hears prose, sees prose, and gets a button. - The OAuth temptation. We almost built a real Google Calendar integration. Sitting down with the actual user (a tired person on day 2 in a new country) made it obvious: the prefilled-URL approach removes an entire consent screen and an API key from the project.
- TTS that doesn't sound like a robot reading another robot. ElevenLabs Multilingual v2 plus the right
voice_idper language was the unlock — the same model can render Hindi, Mandarin, and French convincingly without a per-language pipeline. - Designing against AI slop. We ran the UI against the Hallmark anti-slop rules and stamped a pre-emit self-critique at the top of
globals.css— deep navy paper, warm off-white ink, amber accent kept under 5% of any viewport. - Firefox. No Web Speech API. We detect, fall back to a text input, and never show a broken mic button.
Accomplishments that we're proud of
- 15 languages from day one, including three RTL scripts (Arabic, Urdu, Persian) rendered correctly without a separate codepath.
- Zero accounts, zero database, zero OAuth — and yet the user walks away with real calendar entries on their phone.
- A system prompt that doubles as a protocol: prose for the human, structured JSON for the app, in a single Claude call.
- A UI that is calm. Newcomers don't need a chatbot that sparkles at them — they need a page that looks like the inside of a quiet library. We're proud of how restrained the visual language ended up.
- The whole thing runs on two API keys and a free browser feature.
What we learned
- LLMs can be taught to emit structured side-effect blocks alongside natural prose if you give them a clean fenced delimiter and a strict JSON shape — and downstream parsing should be defensive (we silently drop malformed blocks rather than leak raw JSON to the user).
- Voice-first changes prompt design: short paragraphs, sixth-grade reading level, ~150 words max, because ElevenLabs is going to read it out loud.
- The Google Calendar
render?action=TEMPLATEURL is one of the most underrated pieces of consumer infrastructure on the web — full OAuth-free interoperability for any app that has a date to remember. - Tailwind v4's
@thememakes it genuinely realistic to ban inline colors in code review — every token has one home. - Cutting scope toward the user (no auth, no DB, no app) is almost always the right hackathon move.
What's next for Talk To Canada
- Localize the UI for the 11 languages where only the answers are currently translated — full RTL polish for Arabic, Urdu, Persian.
- Province-specific routing: detect or ask once, then deep-link to the correct OHIP / RAMQ / MSP / AHCIP portal and pre-fill the right office address in the calendar event.
- SMS reminders for users on prepaid plans who don't keep Google Calendar synced — same prefilled-URL philosophy, different channel.
- Document checklists — when the user asks "what do I bring to my SIN appointment?", attach a printable, language-matched checklist.
- Peer mode: a one-button handoff to a volunteer settlement worker for the questions Claude (correctly) refuses, like individual legal advice.
- A native PWA shell so the mic, language, and history work offline once the app is installed
Built With
- nextjs
- typescript
- vercel
Log in or sign up for Devpost to join the conversation.