63 commits. 19 features. 44 bug fixes. 315 files changed. 30,210 insertions. 20,813 deletions. One developer. 48 hours. This was the week we went from "working prototype" to "product we are confident shipping publicly." Every commit was aimed at one goal: making SalesSheet ready for our Product Hunt launch.
The raw stats do not tell the whole story. Of those 315 files, about 80 were net-new feature code, 120 were modifications to existing components, and the rest were test files, configuration changes, and documentation. The 20,813 deletions are actually a good sign — we removed more code than we added in several areas because the new implementations were cleaner than what they replaced. The Telnyx migration alone removed hundreds of lines of Twilio-specific scaffolding while adding more calling features.
The headline feature of week 2 is Voice DNA — our system for teaching the AI your personal writing style. It connects to Gmail and Slack via OAuth, analyzes your sent messages, and extracts a communication fingerprint that includes tone, formality, vocabulary patterns, and signature phrases. Every AI draft from that point forward sounds like you wrote it.
The implementation involved building a new Supabase Edge Function for style analysis, a Vue component for the Voice DNA profile display, and modifications to every AI drafting context to inject the style guide as a system prompt prefix. On Pro plans, the system analyzes 50 Gmail threads. On Ultra, 500 Gmail threads plus 250 Slack messages. The more samples, the more accurate the profile — and the more natural the AI drafts sound.
We migrated our entire telephony stack from Twilio to Telnyx in a single weekend, touching 38 files across the codebase. The migration was not just a provider swap — it was an opportunity to add features that Telnyx's API made straightforward: call hold with music, server-side recording with one-click toggle, speaker boost for noisy environments, and AI-powered call summaries that automatically appear in the contact's activity timeline.
The calling architecture now runs through four Supabase Edge Functions: token provisioning, call initiation, webhook processing, and post-call summarization. The in-call screen features a dark UI with the contact's avatar, a live duration timer, and six control buttons in a 2x3 grid. When recording is active, a pulsing red REC badge appears at the top. The mobile keypad supports T9-style dialing with real-time contact matching — as you type a number, SalesSheet identifies who you are calling before you hit the green button. Full details in the Telnyx migration post.
We added voice input powered by OpenAI's Whisper API across three surfaces: the AI chat, contact notes, and email composition. A microphone button appears next to every text input. Tap it, speak, and the transcribed text appears in the field. The transcription runs through a Supabase Edge Function that streams audio to Whisper and returns text in under two seconds for most messages.
This feature was specifically requested by users who do sales from their phones. Typing a detailed note about a call while walking to your next meeting is painful. Speaking it takes five seconds. The voice input also works in the AI chat, which means you can have a spoken conversation with the AI assistant — ask it to look up a contact, draft an email, or update a deal, all by voice. Combined with Voice DNA, the workflow becomes: speak your intent, the AI drafts in your writing style, you review and send.
Saved Views let users persist and switch between grid configurations. If you have a view filtered to "Leads in California with deals over $10K, sorted by last activity," you can save that configuration and switch back to it with one click. Views are stored per-user in Supabase and include column visibility, sort order, filter criteria, and column widths. Each user can create unlimited views and switch between them from a dropdown in the grid toolbar.
Alongside Saved Views, we shipped Manage Fields — a panel that lets users show, hide, and reorder columns in the contact grid. You can also add custom fields from this panel, choosing from text, number, date, select, and boolean field types. Custom fields are stored in a JSONB column on the contacts table, which means they do not require schema migrations and can be added or removed at any time. This was a critical feature for teams that need to track industry-specific data points that our default schema does not cover.
Org Sharing was the most architecturally significant feature of the week. Before this, SalesSheet was effectively single-user — each account saw only its own contacts and activities. With Org Sharing, contacts, activities, emails, and pipeline data are visible to all members of an organization. This required changes to Row Level Security policies across every table in the database, modifications to every Supabase query to scope by organization rather than individual user, and updates to the real-time subscription system to broadcast changes to all org members.
The real-time sync infrastructure was rebuilt during this sprint to support team-level broadcasting. When one team member updates a contact, every other team member's grid, detail view, and pipeline board updates within 200ms. This is powered by Supabase's real-time subscriptions with a dedup layer on the client side to prevent multiple subscription handlers from creating duplicate updates. We also added optimistic updates — the UI updates immediately when you make a change, then reconciles with the server confirmation. This makes the app feel instantaneous even on slower connections.
Two Slack features shipped this week. First, Slack DMs from the AI chat — you can tell the AI to "send a message to Sarah on Slack about the Acme deal" and it will compose and send a direct message to your teammate. The AI pulls context from the deal record to compose a relevant message, and the recipient gets a native Slack DM that they can respond to normally.
Second, the Slack Channel Picker lets users choose which Slack channel receives CRM notifications. Previously, all notifications went to a hardcoded channel. Now each organization can configure their notification channel from within SalesSheet's settings, choosing from any channel the Slack bot has been invited to. This is important for teams that have dedicated channels for sales activity versus general notifications.
44 bugs were fixed across the sprint. The biggest category was mobile positioning — 7 commits dedicated to fixing overlapping elements, misaligned buttons, and touch targets that were too small on various screen sizes. Mobile CRM is hard because every component needs to work at 375px wide with touch interactions, and what looks fine on an iPhone 15 might break on an older SE. We tested across four screen sizes and fixed every issue we found.
Other notable fixes: click-to-call reliability was improved by adding retry logic when the WebRTC connection drops during establishment, email sync edge cases around OAuth token refresh were resolved, real-time subscription deduplication was hardened to prevent the same event from triggering multiple UI updates, and pipeline drag-and-drop was fixed for touch devices by implementing proper touch event handlers alongside mouse events.
Week 3 is focused on the Product Hunt launch itself. We are building the landing page, writing documentation, recording demo videos, and doing a final pass on every user-facing surface. There are also several features in progress that did not make the week 2 cutoff: email templates, smart scheduling, and the morning briefing AI feature that summarizes your day's priorities. These will ship in the days following launch.
The pace is not sustainable long-term — 48-hour sprints work when you are pre-launch and running on adrenaline, but they are not a healthy engineering practice. After launch, we are moving to a more measured cadence of weekly releases with proper QA cycles. But for now, the goal is clear: ship the best possible product for launch day, and make every one of those 63 commits count.