Portfolio · AI-built

Juanita Soranno

Consultant and operator who builds her own software. The list below is every tool, automation, and app I've shipped with AI — each one because I needed it to work, not as a demo.

I'm a consultant who builds the software my work needs. The list below is what I've shipped — for clients (HireRewards, Receipts) and for the operating system that runs my own day (Crosswalk Cafe, daily-briefing, the time tracker). Each entry leads with what it actually does for someone, not what's under the hood.

How I work

The same person you brief on strategy ships the code. Most of what's on this site is software I built because I needed it to work — for clients (HireRewards, Receipts) or for the day I spend running other people's projects (Crosswalk Cafe, the daily-briefing system, the time tracker).

I take a small number of projects at a time. juanitasoranno@gmail.com

Client work I shipped

  • HireRewards

    friends-first job application trackerIn progress

    A job-search tracker for the friend group helping you, not for a sales funnel. Forward a recruiter email or paste a screenshot; Claude Haiku pulls out the company, role, and status.

    Rebuild of the original HireRewards on Next.js 15 + Supabase. Each user gets an inbound email slug — forward the recruiter thread, it lands in the tracker. Screenshots and emails go to Claude Haiku 4.5 for extraction.

    • Next.js 15 App Router
    • Supabase (Postgres + Google OAuth)
    • Claude Haiku 4.5
    • Resend/Postmark
    • gethirerewards.com
  • Receipts

    PWA for NY unemployment claimantsLive

    Caseworkers have denied four weeks of benefits because claimants couldn't reconstruct what they did Tuesday by Sunday night. Receipts logs activities as they happen and fills the official WS 5 PDF at the end of the week.

    Voice-log job-search activities all week, one-click export to the official NY DOL WS 5 PDF, plus a JobZone Copy view for transcription. Privacy-first: identity (name, NYS ID) lives only in browser localStorage.

    • Next.js 14+ on Vercel
    • Supabase or Neon
    • NextAuth magic links
    • Whisper
    • Claude Haiku
    • `pdf-lib` overlay on the official WS 5 template

My own operating system

  • Crosswalk Cafe

    personal CRMLive

    My contact database, but I never open it. I dictate a 20-second voice note from my watch after a meeting; Claude parses it, finds the right person, and logs the interaction. Briefings show up before the next call.

    Single-user CRM that syncs with Gmail, Slack, and Google Calendar. Apple Watch Shortcut → POST /api/v1/quick-log → Claude parses dictated interaction → fuzzy-matches the contact (warmth-score tiebreak) → logs it → confirms back to the Watch in seconds.

    • Next.js 16
    • React 19
    • Tailwind
    • Supabase (Postgres + RLS)
    • local stdio MCP server
  • daily-briefing

    Zoom recap + cross-system morning briefRunning daily.

    Used to spend an hour every morning on meeting admin: chasing agendas, writing recaps, fanning out action items. This does that pass for me before I'm at my desk.

    zoom_recap.py uses Playwright to log into Zoom, reads recent Zoom AI Companion docs, extracts action items, posts a Slack summary, and pushes tasks to Todoist. daily_briefing.py aggregates Google Sheets + Todoist + Gmail + Slack into a unified morning brief posted to Slack.

    • Python
    • Playwright
    • Slack API
    • Todoist API
    • Google APIs
  • Mac time tracker

    Sampler running, TCC permission not yet verified.

    Stops me from under-billing at $125/hr because end-of-day reconstruction misses real work I did.

    Samples frontmost app, window title, browser URL, open document path, and current calendar event every 30s. Matches each sample to a project via time_rules, rolls consecutive same-project samples into time_sessions, posts hours to Harvest at EOD, feeds into the invoice workflow.

    • Python
    • AppleScript wrappers
    • launchd
    • SQLite
  • Compound 16 monthly invoice tool

    Built

    Turns the monthly invoicing chore (~1 hour of clicking) into a 30-second review of a pre-drafted email.

    On the 4th of each month at 9am, pulls the prior month's hours from Harvest → renders the PDF invoice → uploads it to Google Drive → drafts a Gmail (not auto-sent).

    • Python
    • launchd
    • Harvest API
    • Google Drive + Gmail APIs
  • Saved from Social

    the saves folder that actually does somethingLive

    Turns the Reels and TikToks I save from passive saves-folder graveyards into one thing I will actually do this week.

    iOS Share → "Save to Brain" Shortcut captures any IG/TikTok URL → AI enriches with title, summary, and "what to actually do" bullets → home-screen PWA + Sunday 9am EDT digest email. Four action buttons per item: Text a friend, Add to Calendar, I did this!, Snooze 1 week.

    • Next.js
    • Postgres
    • OpenAI Whisper + Claude for enrichment
    • behind HTTP basic auth
  • daily-work-briefing

    weekday 7:15amRunning daily.

    A 7:15am Slack brief: action items first, FYIs second. Calendar conflicts and project-plan items on top.

    Generates a warm, plain-language morning briefing. Computes the date window, pulls calendar conflicts and breathing room, surfaces project-plan items.

  • daily-zoom-ai-briefing

    weekday morningsRunning daily.

    Yesterday's meetings, summarized in one Slack post and archived to disk as markdown. Monday's pass covers Fri–Sun.

    Fetches the previous business window's Zoom AI Companion docs (Mon covers Fri–Sun; Tue–Fri covers prior day), posts a bullet digest to Slack, archives full markdown to disk. Handles DST properly.

  • meeting-recap

    per-meeting triggerLive

    Drafts the right recap automatically — external clients get a polished email; internal Common Group meetings get a Slack message.

    Reviews the Zoom transcript, decides email vs. Slack based on whether external clients were on the call, drafts the recap.

  • st-cg-agenda-reminder

    TuesdaysRunning weekly.

    Keeps the weekly ST/CG HPS planning meeting agenda full without me having to remember to chase the group every Monday night.

    Drafts a Gmail (not auto-sent) to the ST/CG distribution list reminding them to drop items into the running agenda doc before tomorrow's call.

  • brain.db

    Professional Brain SQLite databaseLive

    One local source of truth for contacts, journal entries, meetings, partnerships, time tracking, and the inbox — instead of context scattered across notebooks, Notion, and email.

    SQLite with 10 tables — contacts, journal, meetings, partnerships, projects, inbox_log, and four time-tracking tables. Powers the time tracker, Crosswalk Cafe sync, and inbox routing.

Experiments and skills

  • chat-synopsis

    Claude Code skillBuilt

    Some conversations with Claude produce decisions or reframes worth keeping. This pulls those out as a markdown artifact and files it to Obsidian, Notion, or Drive.

    A salience filter (not a transcript tool) that captures a conversation as a durable markdown artifact, anchored to what was learned or decided. Routes to Obsidian, Notion, Drive — wherever the user's thinking system lives.

    • Claude Code skill
    • Markdown
  • cc-tap

    Claude Desktop ↔ Claude Code bridgeExperimental

    Stops me copy-pasting between Claude Desktop and Claude Code windows when both are working on the same project.

    Experimental MCP server that lets Claude Desktop (or another Claude Code instance) read and interact with a running Claude Code Remote Control session through MCP.

    • Python 3.11+
    • MCP server
    • GitHub `es617/cc-tap`
  • voicenotes-mcp

    Live

    Lets Claude read my voice notes so I can ask "what did I record last Tuesday?" and get a real answer.

    Local MCP server giving Claude read-only access to voicenotes.com via the official integrations API. Two tools: list_notes (with tag/time/substring filters) and read_note (transcript + AI creations + signed audio URL).

    • Node 18+
    • TypeScript
    • MCP SDK
  • LinkedIn network analyzer

    Live

    I meet a lot of people. Clustering my LinkedIn contacts by where I first met them — conference, intro, prior job — gives me a way to remember context, and it syncs into my CRM.

    Python pipeline ingests a LinkedIn data export, clusters contacts by first-met location/event, generates an HTML report with charts, and syncs the enriched first-met metadata back into Crosswalk Cafe.

    • Python
    • HTML/CSS
    • Crosswalk Cafe Supabase write path
  • Overclock

    store price chatBuilt

    Skip the tab-thrashing of comparing prices across two stores — ask one question, get both answers.

    Chat app where you specify two online stores up front, then ask for any product. Tavily web search finds the store domain + lowest matching product on each.

    • Next.js
    • Vercel
    • Anthropic API
    • Tavily