Juanita Soranno
connect@jsoranno.com

Portfolio · AI-built

The same person you brief on strategy ships the code.

I'm a consultant who builds the software my own week needs, then ships the ones that hold up for clients (HireRewards, Receipts) and the operating system that runs my day (Crosswalk Cafe, daily-briefing, Billable). Every system has a human review point: the capture and the draft are automated; the send and the accountability stay with me.

Available for consulting now. Open to senior ops roles at AI-forward companies starting late 2026.

Career & job-search tools

HireRewards

HireRewards

a friendlier job-application trackerIn progress

Helps you find roles worth applying to, remembers where you left off, and nudges you when you've gone quiet (or the role has). No spreadsheet. It taps into what you're already using — a browser extension, your Gmail. It celebrates your submissions, because in this economy any forward movement is a win. The admin view lets career and workforce professionals oversee a cohort of job seekers and meet them where they are.

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

unemployment paperwork, done for youLive

You applied for three jobs on Tuesday. By Sunday night, when New York State's WS 5 form is due, the details are gone. Receipts logs each application the moment it happens and fills the official PDF for you at the end of the week. The stakes aren't abstract: claimants have lost four weeks of benefits over a form they couldn't reconstruct.

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

Meetings & morning briefings

  • Morning brief & meeting recaps

    Morning brief & meeting recaps

    automated standup prepRunning 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. The same stack runs for the team I lead — a Tuesday agenda nudge, Zoom AI recap, and tagged Slack action items go out for our recurring weekly client meeting.

    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

  • Weekday work brief

    what the day wants from meRunning daily.

    By the time I open Slack at 7:30 with coffee, the brief is waiting: the two calendar conflicts I need to fix before 10, what I committed to on which project plan, the FYIs I can read on the train. I start the day knowing what the day actually wants from me.

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

  • Yesterday's meetings, recapped

    one morning digestRunning daily.

    I walk into Tuesday already knowing what was decided in Monday's four meetings — without rereading four transcripts. Yesterday's calls come back as a single Slack post each morning (Monday's covers the weekend). The full recaps are archived to disk if I need to pull a quote.

    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

    client email or team Slack, automaticallyLive

    Knows the difference between a client recap and a team recap. External attendees on the call? Drafts an email. Internal only? Drops a Slack message. Same trigger, different register.

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

  • Weekly agenda reminder

    keeps the standup doc fullRunning weekly.

    Keeps the running agenda for my weekly client standup from going into Tuesday's call empty. Drafts the Monday-night nudge to the group; I review and send.

    Drafts a Gmail (not auto-sent) to the meeting attendees reminding them to drop items into the running agenda doc before tomorrow's call.

  • Voice notes for Claude

    in-person meeting recapsLive

    The in-person analog to my Zoom recap workflow. When the conversation happens at a coffee shop or in a hallway, I record it on my phone (with permission, always). This lets Claude read those voice notes the same way it reads Zoom transcripts — so the recap, action items, and follow-ups land in the same place whether the meeting was on video or across a table.

    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

Time, billing & focus

  • Billable

    Billable

    automatic time trackingLive

    If you're a consultant, you've done this: it's 6pm, you're trying to remember what you worked on between the 11am call and lunch, and you guess low. Affinity Live puts that gap at 10–20% of billable hours. Billable watches what's actually on my screen every 30 seconds, matches it to a project, and posts the hours to my timesheet at the end of the day. I stop guessing.

    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

  • Focus Nudges

    an ADHD-friendly attention coachLive

    Focus help that stays calm. The same screen samples that bill my time also watch for the patterns that quietly cost me a day: drifting onto a time-sink site, three hours heads-down with no break, 1pm with no lunch, a wall of back-to-back meetings and no recovery. When one shows up I get a single quiet macOS banner — not a stream of alerts. The distraction nudge names a real priority for today, pulled from that morning's brief, so it reads "back to HPS?" instead of "get back to work."

    A launchd agent reads the same time_samples every 5 minutes and fires at most one banner per tick — weekdays 9–6 only, with a 20-minute cooldown between any two. Four nudge types: distraction → today's priority (≥ 80% of the last 10 min on a denylisted app or site, and not in a meeting), stretch (≥ 90 min of unbroken focus), meal (1:00–2:30pm with no real break since 11:30), and post-meeting recovery (a long back-to-back block that just ended). One-touch off switch; the denylist and every threshold are tunable.

    Python · launchd · SQLite · AppleScript banners

  • Monthly invoice builder

    invoicing as a 30-second reviewLive

    Turns the monthly invoicing chore — about an hour of clicking — into a 30-second review of a pre-drafted email to my client.

    On the 4th of each month at 9am, pulls the prior month's hours from my time tracker, renders the PDF invoice, uploads it to Google Drive, and drafts a Gmail to the client and accounting contact with the PDF attached. Nothing sends until I hit the button.

    Python · launchd · Harvest API · Google Drive + Gmail APIs

Relationships & network

  • Crosswalk Cafe

    Crosswalk Cafe

    a private memory layer for relationshipsLive

    I had coffee with someone on Tuesday. Walking back to the office, I dictated twenty seconds into my watch — what we talked about, what they're working on, what I said I'd send them. By the time I sat down, it was logged against their contact card and the action item was waiting. It also reads my messages, my LinkedIn, and my calendar, so the threads I'd otherwise lose stay attached to the people they belong to. So I can remember — be a better friend, a better colleague, whatever the moment calls for.

    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

  • 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

Capture & knowledge

  • Saved from Social

    Saved from Social

    the saves folder that actually does somethingLive

    Turns the Reels and TikToks I save from a passive graveyard into things I can actually act on. It surfaces what I'd otherwise forget — the craft I bookmarked for Saturday with the kids, the recipe I meant to try this week. Brick-and-mortar saves will eventually nudge me when I'm nearby that coffee shop or store.

    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

  • Chat synopsis

    save what a conversation decidedBuilt

    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

Foundations

  • Professional Brain

    Professional Brain

    one local source of truthLive

    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.

  • cc-tap

    a bridge between AI desktop apps and CLI sessionsExperimental

    Stops me copy-pasting between AI windows when two of them are working on the same project. The desktop client — Claude, Kimi, Hermes, whatever's in front — talks to the CLI session through MCP. The work keeps running in the background on my private server while I close the laptop.

    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`

  • Build Scoreboard

    the idea backlog as a gameBuilt

    I generate ideas faster than I ship them: 54 tracked, 51 still queued. The scoreboard turns that pile into a game. Every idea is worth points by effort, shipping earns them, and a level bar shows how close the next level is. Quick wins surface at the top, so the next thing to build is one click away instead of buried.

    Reads the build_backlog table in Professional Brain and renders a single static dashboard: a hero score (points shipped, level, last-shipped date), counts of shipped / building / queued, a "next to unlock" row sorted to the low-effort wins, and a filterable board that groups every idea by category and status. Shipped nodes light up; queued ones stay locked with their points-to-earn. Regenerated after each backlog sync and by the Sunday "What's Next?" routine.

    Python (`build_scoreboard.py`) · SQLite (brain.db `build_backlog`) · static HTML/CSS/JS

Let's talk

Tell me what you're working on. Pick the closest fit, leave a note, and it comes straight to me — I read every one of these myself.

Available for consulting now. Open to senior ops roles at AI-forward companies starting late 2026.

What's this about?
or email connect@jsoranno.com