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 @theme tokens — every color is OKLCH and lives in app/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 `event JSON 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_id map 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 `event JSON 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_id per 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=TEMPLATE URL 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 @theme makes 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

Share this project:

Updates