Project Info
This project did not submit a demo video on Devpost.
Inspiration
Whether it's at a college party, a public outing, or during a simple stroll downtown, individuals often find themselves in uncomfortable, unwanted situations due to unwanted attention. In these moments, a discreet way to seek help is crucial. In the bartending world, this concept is known as an "angel shot"—a code word or drink order that discreetly signals to staff that a customer needs assistance. Phone calls are a powerful tool in these uncomfortable situations, as they not only deter unwanted attention by creating an external conversation but also offer a lifeline to contact emergency services or trusted individuals. Thus, they server as angel shots outside of a bartending context. But what if no one is available to answer the call? How can individuals ensure they'll have someone to talk to when they need help the most?
What it does
AngelShot simulates a realistic phone call a variety of user-customizable AI-based assistants. Users will pre-define assistants that they can request a call from whenever they're placed in an unwanted situation. These assistants can take on roles; for instance, user's can create an assistant meant to be "an uncle that they haven't seen in awhile". Additionally, assistants can be given a conversation starter. This could range from topics like sports, gardening, etc... anything that the user will feel comfortable talking about in an uncomfortable situation. When an individual is in an uncomfortable situation, they can request a call from any of their created assistants to start a normal conversation. However, with each response, the assistant provides the user two discreet, context-based code words. These code words trigger pre-configured safety actions of two levels. For example, in a gardening-themed conversation, the assistant may provide the words "monstera" and "weeding". If the user says the first keyword "monstera" in their response, the assistant will know to share the user’s live conversation with emergency contacts. If the user says the second keyword "weeding" in their response, the assistant will know to forward you to emergency services instantly.
How we built it
We deployed a Next.js application on Vercel, written in Typescript and styled using Tailwind + Shadcn and a variety of frontend libraries. For authentication, we used Clerk to allow users to quickly signup using their phone numbers. As a means of handling phone communication, we utilized VAPI's API to efficiently create customizable AI assistants. VAPI streamlined the integration of voice communication in our application, allowing us to simulate realistic phone calls with AI-based assistants. For speech-to-text functionality, we used a Deepgram's Nova 2 Phonecall Model, specifically tailored for low-bit phone calls. This ensures accurate transcription, even if users are calling from remote areas or in noisy environments, guaranteeing that conversations and safety triggers are captured correctly. Then, to simulate natural and context-aware dialogue, we used OpenAI's GPT-4 model. Using VAPI's API, we passed a system prompt to ensure the AI assistant can generate relevant conversations, generate two context-specific code words, and react appropriately via function calls if any of the code words are spoken. Lastly, for text-to-speech conversion, we chose ElevenLabs' models to create high-quality, natural-sounding voices for the AI assistants, enhancing the realism and comfort of the simulated calls.
Challenges we ran into
Our entire team didn't have WiFi for essentially half the event, so we spent the first half of the event ideating. The last half of the event was when our application truly came to life. Another issue that we ran into was correctly prompt engineering the virtual assistant. Once we found the right prompts, it was smooth sailing.
Accomplishments we're proud of
We're proud of developing a discreet safety tool that could potentially save lives. Integrating customizable AI assistants and creating a reliable emergency response system were key milestones that we were able to accomplish.
What's next
We plan to enhance AngelShot with more customization options, additional safety features such as sharing location and real time stress level analysis. We also aim to improve accessibility, perhaps making the application into a mobile app using technologies like React Native.
This is a Next.js project bootstrapped with create-next-app.
Getting Started
First, run the development server:
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
Open http://localhost:3000 with your browser to see the result.
You can start editing the page by modifying app/page.tsx. The page auto-updates as you edit the file.
This project uses next/font to automatically optimize and load Geist, a new font family for Vercel.
Learn More
To learn more about Next.js, take a look at the following resources:
- Next.js Documentation - learn about Next.js features and API.
- Learn Next.js - an interactive Next.js tutorial.
You can check out the Next.js GitHub repository - your feedback and contributions are welcome!
Deploy on Vercel
The easiest way to deploy your Next.js app is to use the Vercel Platform from the creators of Next.js.
Check out our Next.js deployment documentation for more details.
Analysis
View
Metric
- 50
- 46
- 43
- 10
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- Next.jsIn code
- ReactIn code
- Tailwind CSSIn code
- TypeScriptIn code
5 of 5 appear in the indexed code.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
101 KB
Source files
41
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
mikieyx/SafeTalk
55 files · 988 KB · @ 0b72b4f
Structure
Interface
28 files · 51%Screens, components and styles rendered to the user.
API & routing
5 files · 9%Request entry points: routes, handlers and controllers.
Application logic
7 files · 13%Domain rules, services and shared utilities.
Data & schema
1 file · 2%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript97%
- CSS2%
- Markdown1%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
package.json
npm · 34- @clerk/nextjs
- @hookform/resolvers
- @prisma/client
- @radix-ui/react-alert-dialog
- @radix-ui/react-dialog
- @radix-ui/react-icons
- @radix-ui/react-label
- @radix-ui/react-popover
- @radix-ui/react-scroll-area
- @radix-ui/react-select
- @radix-ui/react-slot
- @radix-ui/react-toast
- class-variance-authority
- clsx
- cmdk
- jspdf
- lucide-react
- next
- +16 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
Feature verification
Call history / call detail view with transcript, summary, recordingVerified
Implied by 'sharing live conversation' and safety record-keeping; call detail page shows transcript, summary, recording, and PDF export
Claimed on readmehigh confidenceapp/call/[id]/page.tsx:6— Page fetches call by id, restricts access to the user or their emergency contacts, and renders transcript/summary/recordingcomponents/pdfGenerator.tsx:1— GeneratePDF component used on the call page for exporting call info
Clerk authentication with phone number sign-upVerified
Clerk is used for authentication, allowing users to sign up quickly using their phone numbers
Claimed on Devposthigh confidenceapp/layout.tsx:39— ClerkProvider, SignedIn/SignedOut, RedirectToSignIn wired at root layoutmiddleware.ts:3— clerkMiddleware protects routesprisma/schema.prisma:17— User model is keyed by phone_number, and app code (actions/assistant.ts, actions/emergency_contact.ts) consistently uses user.primaryPhoneNumber as the user identity
Custom AI assistant creation with role/description and conversation topicVerified
Users pre-define AI assistants with a role description and a conversation starter/topic
Claimed on Devposthigh confidenceactions/assistant.ts:6— createAssistant stores description, conversation_topic, gender per usercomponents/AddAssistantForm.tsx:29— Form collects description, conversation_topic, gender and calls createAssistantprisma/schema.prisma:40— Assistant model persists description and conversation_topic
Deepgram Nova-2 phonecall transcription modelVerified
Speech-to-text uses Deepgram's Nova 2 Phonecall model
Claimed on Devposthigh confidenceapp/api/(dbServerActions)/mongoActions.ts:33— transcriber set to { model: 'nova-2-phonecall', provider: 'deepgram' } in call options
ElevenLabs text-to-speech voicesVerified
ElevenLabs models generate natural-sounding assistant voices
Claimed on Devposthigh confidenceapp/api/(dbServerActions)/mongoActions.ts:81— voice provider set to '11labs' with voiceId based on assistant gender
Emergency contact management (add/remove, requires contact to have an account)Verified
Users can add trusted emergency contacts who are notified in unsafe situations
Claimed on Devposthigh confidenceactions/emergency_contact.ts:6— createEmergencyContact validates receiver exists as a user and is not self, then persists EmergencyContact recordcomponents/AddContactForm.tsx:1— Frontend form file exists for adding contacts (paired with the server action)
Next.js + TypeScript + Tailwind + Shadcn frontendVerified
Built as a Next.js app in TypeScript, styled with Tailwind and Shadcn plus frontend libraries
Claimed on Devposthigh confidencepackage.json:1— Next.js 14, TypeScript, Tailwind, Radix UI (shadcn primitives), react-hook-form, zod present as dependenciescomponents.json:1— shadcn/ui components.json config presenttailwind.config.ts:1— Tailwind configuration file present
Ongoing call banner visible to emergency contactsVerified
Implied safety feature: emergency contacts can see an in-progress emergency call and view info
Claimed on readmehigh confidencecomponents/OngoingCalls.tsx:6— Queries ongoing calls where the current user is an emergency contact (receiver) and links to the call detail page
OpenAI GPT-4 powered conversationVerified
OpenAI's GPT-4 model drives natural, context-aware dialogue
Claimed on Devposthigh confidenceapp/api/vapiAgentUtils.ts:151— model config sets provider: 'openai', model: 'gpt-4o'
Simulated AI phone call via VAPIVerified
Requesting a call from an assistant triggers a realistic simulated phone call using VAPI's API
Claimed on Devposthigh confidenceapp/api/callContact/[contactid]/route.ts:29— POST route calls https://api.vapi.ai/call with merged call options and VAPI_API_KEYapp/api/vapiAgentUtils.ts:141— defaultOptions defines the VAPI call/assistant configuration
Standard Next.js create-next-app boilerplate (dev server, font optimization)Verified
Project bootstrapped with create-next-app, uses next/font Geist font, dev server via npm run dev
Claimed on readmehigh confidenceapp/layout.tsx:3— Uses next/font/local with Geist font filespackage.json:5— dev script runs 'next dev'
Two context-based code words trigger two-level safety actionsVerified
The assistant generates two discreet code words per conversation; the first shares the live conversation with emergency contacts, the second forwards to emergency services
Claimed on Devposthigh confidenceapp/api/vapiAgentUtils.ts:199— systemPrompt instructs the model to generate two keywords and call specific tools when each is spokenapp/api/(dbServerActions)/mongoActions.ts:37— transcript_logger function tool posts to /api/notifyContact/[user_phone_number] for the 'contact emergency contacts' actionapp/api/vapiAgentUtils.ts:80— fake911 transferCall tool forwards the call to a fixed number for the 'contact authorities' action
Notify emergency contacts by placing calls to themCode-supported
Sharing live conversation info with emergency contacts when the first keyword is triggered
Claimed on Devpostmedium confidenceapp/api/notifyContact/[user_phone_number]/route.ts:41— Looks up emergency contacts and places a VAPI call to each with a generic notification message
Transfer to emergency services (911) when second keyword triggeredCode-supported
Saying the second keyword instantly forwards the user's call to emergency services
Claimed on Devpostmedium confidenceapp/api/vapiAgentUtils.ts:80— fake911 tool transfers the call to a hardcoded number +17313419366 labeled 'Fake nine one one', not an actual 911 integration; endCall route reacts to 'assistant-forwarded-call' by marking authorities_notifiedapp/api/endCall/route.ts:15— Confirms the forwarded-call event is tracked, but the destination is a placeholder/fake number rather than real emergency services
React Native mobile appClaimed only
Future roadmap item: turning AngelShot into a mobile app using React Native
Claimed on Devposthigh confidenceReal-time stress level analysis and location sharingClaimed only
Future roadmap item: real time stress level analysis and location sharing (What's next section)
Claimed on Devposthigh confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.