{"id":50789646,"url":"https://github.com/ramonclaudio/counter","last_synced_at":"2026-06-12T10:02:24.234Z","repository":{"id":353383524,"uuid":"1191185966","full_name":"ramonclaudio/counter","owner":"ramonclaudio","description":"Real-time deal intelligence powered by ElevenLabs agents and Firecrawl search. Stop overpaying, start negotiating.","archived":false,"fork":false,"pushed_at":"2026-04-23T17:01:06.000Z","size":2123,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-23T18:26:24.480Z","etag":null,"topics":["convex","deal-intelligence","elevenhacks","elevenlabs","expo","firecrawl","hackathon","negotiation","react-native","voice-ai"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ramonclaudio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-25T02:05:01.000Z","updated_at":"2026-04-23T17:24:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ramonclaudio/counter","commit_stats":null,"previous_names":["ramonclaudio/counter"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ramonclaudio/counter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonclaudio%2Fcounter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonclaudio%2Fcounter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonclaudio%2Fcounter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonclaudio%2Fcounter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ramonclaudio","download_url":"https://codeload.github.com/ramonclaudio/counter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramonclaudio%2Fcounter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34238715,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["convex","deal-intelligence","elevenhacks","elevenlabs","expo","firecrawl","hackathon","negotiation","react-native","voice-ai"],"created_at":"2026-06-12T10:02:23.129Z","updated_at":"2026-06-12T10:02:24.229Z","avatar_url":"https://github.com/ramonclaudio.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Counter\n\n![Counter Cover](assets/cover-image.png)\n\nReal-time deal intelligence powered by ElevenLabs agents and Firecrawl search. Stop overpaying, start negotiating.\n\n`ElevenLabs` · `Firecrawl` · `Convex` · `Better Auth` · `Expo SDK 56 (canary)` · `React Native 0.84` · `React 19` · `Bun`\n\n## ElevenHacks Season 1\n\nMy submission for the [ElevenHacks](https://elevenlabs.io/elevenhacks) hackathon, a collaboration between [ElevenLabs](https://elevenlabs.io) and [Firecrawl](https://firecrawl.dev).\n\n- [Video Demo](https://x.com/ramonclaudio/status/2037188827782013018)\n- [LinkedIn Post](https://www.linkedin.com/posts/ramonclaudio_elevenhacks-ugcPost-7442954144543301633-Qaiw)\n\n## What It Does\n\nWhether you're checking prices before you buy, practicing for a negotiation, or need real-time coaching while you're in one, Counter has your back.\n\n**Research** - Ask about any product. Counter searches the web and drops intel cards with prices, market sentiment, scam warnings, and where to buy. You talk, it searches. Cards show up as results come back.\n\n**Live** - Keep Counter in your ear during the actual negotiation. It listens to what the other side says and whispers coaching back. Invoice prices, counter offers, when to hold, when to walk.\n\n**Practice** - A tough AI salesman that throws real tactics at you: anchoring, urgency, good cop/bad cop. It scores your technique and tells you what to fix. Run the raise conversation, the car deal, the lease renewal.\n\n## How It Uses ElevenLabs + Firecrawl\n\n**ElevenLabs Conversational AI** runs the voice agent. Connects via WebRTC through `@elevenlabs/react-native`. Each mode has its own personality and system prompt. Live mode whispers. Practice mode plays a salesman. Research mode is a calm analyst. The agent calls custom tools (`updateIntelCards`, `skipTurn`) to push structured data back to the client as it talks.\n\n**Firecrawl** runs the web search. You ask about a product, Counter fires queries through Firecrawl's API on the Convex backend, processes results, and feeds them back to the ElevenLabs agent as tool context. The agent reads the results and pushes intel cards to the feed.\n\n## Architecture\n\n| Layer | Tech |\n| :--- | :--- |\n| Package Manager | Bun |\n| Framework | Expo SDK 56 (canary) · React Native 0.84 · React 19 |\n| Backend | Convex (real-time queries, mutations, actions, crons) |\n| Auth | Better Auth via `@convex-dev/better-auth` |\n| Voice AI | ElevenLabs Conversational AI via `@elevenlabs/react-native` |\n| WebRTC | LiveKit (`@livekit/react-native`) |\n| Web Search | Firecrawl API (Convex actions) |\n| Email | Resend via `@convex-dev/resend` |\n| UI | `@expo/ui` (Swift UI) · SF Symbols · Haptics |\n| Styling | React Native StyleSheet · `DynamicColorIOS` |\n| Animation | React Native Reanimated 4 |\n| Lists | `@shopify/flash-list` |\n\n## Intel Cards\n\nFour types, color-coded:\n\n| Type | Color | What It Shows |\n| :--- | :--- | :--- |\n| Price Intel | Green | Prices across retailers/platforms with best price highlighted |\n| Alert | Red | Scam warnings, bad reviews, overpriced flags |\n| Alternative | Teal | Cheaper or better options you didn't know about |\n| Leverage | Orange | Negotiation ammo: invoice prices, incentives, market data |\n\nEach card shows the source, a favicon chip, and a savings pill when Counter finds a better price.\n\n---\n\n\u003cdetails\u003e\n\n\u003csummary\u003e\u003cstrong\u003eSetup \u0026 Development\u003c/strong\u003e\u003c/summary\u003e\n\n### Prerequisites\n\n| Service | Purpose | Sign Up |\n| :--- | :--- | :--- |\n| [Convex](https://convex.dev) | Real-time backend | Free tier available |\n| [ElevenLabs](https://elevenlabs.io) | Voice AI agent | Free tier available |\n| [Firecrawl](https://firecrawl.dev) | Web search API | Free tier available |\n| [Resend](https://resend.com) | Transactional email | Free tier (3k/month) |\n| [Expo](https://expo.dev) | Build service | Free tier available |\n\n**Local requirements:** Bun, Xcode 16+\n\n\u003e [!IMPORTANT]\n\u003e Expo Go is not supported. SDK 56 requires development builds. Use `expo start --dev-client`.\n\n### Quick Start\n\n**1. Clone \u0026 Install**\n\n```bash\ngit clone https://github.com/ramonclaudio/counter.git\ncd counter\nbun install\n```\n\n**2. Create Convex Deployment**\n\n```bash\nbunx convex dev\n```\n\nFollow the prompts. First push will fail until env vars are set.\n\n**3. Set Environment Variables**\n\n```bash\nbunx convex env set BETTER_AUTH_SECRET=$(openssl rand -base64 32)\nbunx convex env set ELEVENLABS_API_KEY=sk_xxxxxxxxxxxx\nbunx convex env set ELEVENLABS_AGENT_ID=agent_xxxxxxxxxxxx\nbunx convex env set FIRECRAWL_API_KEY=fc-xxxxxxxxxxxx\nbunx convex env set RESEND_API_KEY=re_xxxxxxxxxxxx\nbunx convex env set RESEND_FROM_EMAIL=noreply@yourdomain.com\nbunx convex env set SITE_URL=counter://\n```\n\nAdd to `.env.local`:\n\n```bash\nEXPO_PUBLIC_ELEVENLABS_AGENT_ID=agent_xxxxxxxxxxxx\n```\n\nRe-run `bunx convex dev`. It will push successfully.\n\n**4. Run**\n\n**Terminal 1 (Backend):**\n\n```bash\nbun run convex:dev\n```\n\n**Terminal 2 (App):**\n\n```bash\nbun run ios\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003e\u003cstrong\u003eCommands\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\n# Development\nbun run ios                 # Build + simulator\nbun run ios:device          # Build + physical device\nbun run convex:dev          # Convex backend with hot reload\n\n# Quality\nbun run typecheck           # tsc --noEmit\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003e\u003cstrong\u003eTroubleshooting\u003c/strong\u003e\u003c/summary\u003e\n\n| Problem | Solution |\n| :--- | :--- |\n| First `convex dev` fails | Expected. Set env vars per step 3, then re-run |\n| Voice not connecting | Check `ELEVENLABS_API_KEY` and `ELEVENLABS_AGENT_ID` |\n| Search not returning results | Check `FIRECRAWL_API_KEY` in Convex env |\n| Push notifications fail | Use physical device (simulator doesn't support) |\n| Expo Go crashes | Use `expo start --dev-client` instead |\n\n\u003c/details\u003e\n\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framonclaudio%2Fcounter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Framonclaudio%2Fcounter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framonclaudio%2Fcounter/lists"}