Inspiration
King County has one of the largest Ethiopian communities on the US West Coast, plus major Eritrean, Somali, and Oromo populations concentrated in Rainier Valley, Tukwila, SeaTac, Kent, and the Central District. For these families, finding subsidized childcare means navigating WCCC, ECEAP, Head Start, SPP, EHS, and HSIB, each with its own eligibility, paperwork, and waitlist, often in a language they do not speak. Generic translators like Google Translate move words across languages but lose meaning. They do not know what WCCC is, they cannot filter a map of DCYF-licensed providers by allergy or schedule, and they cannot remind a parent about a deadline. We built Sikia (Swahili for "to listen") because the lane was open and the population was real, local, and undeserved.
What it does
Sikia is a browser-based bilingual childcare concierge with two surfaces. On the parent side, a family opens a map of DCYF-licensed Seattle providers, asks a question in Amharic or English ("which centers accept WCCC and are walking distance from Rainier Beach?"), and a single Bedrock agent calls tools to update search filters, switch panels, add deadlines to the plan view, highlight specific providers, and reply in both languages on screen. On the provider side, a partner like Amar Play and Learn Daycare sees the same family-supplied data (allergies, languages spoken, pickup schedule, emergency contact) without the family having to fill out a second form. One source of truth, permissioned to both sides.
How we built it
Single AWS SAM stack in us-west-2. One Lambda for /ask, one Lambda for /healthz, one DynamoDB table with a TTL, API Gateway REST with CORS. The agent runs on Amazon Bedrock Claude Sonnet 4.6 via the Converse API with tool use, where every tool call is a typed discriminated mutation the server validates before dispatching. Bilingual system prompts live in versioned files under prompts/, with the family's language always primary and English secondary. IAM is scoped narrowly to bedrock:InvokeModel and that one table. The frontend is a Next.js 14 PWA with a thin proxy route that falls back to a deterministic mock when the API base URL is unset, with an explicit "offline demo" badge so we never mislead the user.
Observability is built in: every Bedrock turn emits a structured JSON log line (request id, salted family-id hash, latency, token counts, tool-call count, primary language, status), four CloudWatch metric filters lift those fields into the Sikia/Ask namespace, and a single CloudWatch dashboard renders request volume, p95 latency, tokens in vs out, and a USD/day spend estimate computed directly from token totals.
Challenges we ran into
The biggest pivot happened mid-build. We started as a college-mail translator and realized two days in that the harder, more honest problem was childcare access for non-English-speaking families. That meant rebuilding the agent contract, the prompts, and both dashboards while keeping the AWS stack intact.
On the AWS side, we hit Windows Git Bash auto-translating Unix paths into Windows paths when calling the AWS CLI, which silently mangled log-group names until we found the MSYS_NO_PATHCONV=1 workaround. The CloudWatch errors widget appeared to show every request as an error until we realized it was charting SampleCount of a metric whose DefaultValue was 0, and the fix was a one-line stat override. Wiring Bedrock tool use to surgically mutate a Next.js dashboard (filter chips, map highlights, plan events) without losing the bilingual answer card took several iterations of the schema before the model used the tools the way we wanted.
Accomplishments that we're proud of
A real Bedrock agent, not a chatbot wrapper. The model emits multiple tool calls per turn and the dashboard responds to all of them in one round trip. Bilingual on screen everywhere, with Amharic in Ge'ez script as the hero language and English always alongside. A live CloudWatch dashboard with a real cost estimate so judges and nonprofit operators can see exactly what each conversation costs. A working honest-limits slide and HONEST_LIMITS.md doc that names what is real and what is mocked, because we would rather lose points for honesty than win them on a misleading demo. And a Day-0 handoff document that names three real Seattle nonprofits (Mary's Place, El Centro de la Raza, CISC) who could fork this tomorrow.
What we learned
Pivoting late is fine if the new problem is honest and your stack is general. Tool use is a real architectural primitive, not a parlor trick; once we modeled the dashboard as a discriminated mutation schema, the model became reliable. Observability you have to dig for in the console is observability you will not look at, so put the dashboard URL in the stack outputs. And the security posture this population deserves (row-level security, field-level encryption, audit logging, real federated identity) is not something you can ship in 36 hours, and pretending otherwise would be worse than naming the gap.
What's next for Sikia
The roadmap, in order: Amazon Cognito federated with the WA-State parent-portal SSO so families sign in with credentials they already have. Row-level security on family records and field-level encryption on PII. A nightly sync job that pulls the DCYF licensing feed into DynamoDB so the provider list stops being curated. A WCCC eligibility pre-check so subsidy status is verified, not just displayed. Live routing via Google Routes for walking and OneBusAway for transit, because static drive times are useless for the families we serve. Provider-side enrollment paperwork e-sign. And family-side push notifications via Amazon SNS for waitlist movement and deadline reminders. The list of things we did not build is the roadmap, and we wrote it down so the nonprofit that picks this up does not have to guess.
Built With
- amazon-web-services
- next.js
Log in or sign up for Devpost to join the conversation.