Product · 2026
Spindle
Automates live agents over voice, text, and email channels, for small businesses and freelancers.
Live demo
Try the desktop app.
Choose a tab to explore the inbox, calls, calendar, and more.
A working prototype with fictional people and businesses.
Mobile companion · live prototype
Everything that needs you, one swipe away.
A working prototype of the phone app on fictional demo data — Lumen Headshots, a Los Angeles studio shooting roster headshots for talent agencies. Wake the phone and use it: clear the Needs-You deck with a swipe, step in on an escalation, call a voicemail back, move a booking.
Raw web elements, not a video: the swipe-to-approve deck with its four-second undo, the merged SMS + email thread, a live call screen, the bookings calendar, and a replayable tour. Scrolling over the phone scrolls the phone; the page holds still.
The problem
Trusting AI with customer conversations.
Handing your customer conversations to an AI is a scary thought for any business owner. It should be. Contact people the wrong way with an automated system and you are not just annoying them; under the TCPA you can be sued for every single message.
And yet nobody sells the thing a small business actually needs: one assistant that answers the phone, the texts, and the email, books the appointment, and knows when to hand you the conversation.
TCPA · 47 U.S.C. § 227
$500–$1,500per unsolicited text or call. No cap. Class actions stack.
The approach
Building more of the stack in-house.
An AI front desk is an obvious idea, so I started by studying everyone already selling one: what they offered, what they charged, and what they were built on. Underneath, every one of them was a stack of other companies' services with a margin on top.
I wanted the opposite: as few third parties as I could get away with. The first version of Spindle sat on Twilio. Then it became clear that with enough code I did not need to pay Twilio to run voice and text at all; I could build the engine on Telnyx myself. Every dependency I wrote out of the stack was a cut nobody else was taking. The projected margin is what makes this exciting: Spindle covers all of its own operating costs and clears $300+ a month with only about five paying customers.
Keeping a record of every obligation.
Research was the largest single part of this project, and it never stopped. Spindle sits under TCPA, CAN-SPAM, state text-consent statutes, AI-disclosure rules, and quiet-hours law — a body of obligations that changes month to month.
So I built the Obligation LedgerObligation LedgerA living register of every legal and contractual obligation Spindle is under — 124 rows and counting. Each has a source (TCPA, CAN-SPAM, the Telnyx AUP…), the channel it touches, and how it's satisfied: in code, in the terms, or flowed down to the user. Agents research each area of law, decide whether a development applies, and if it does, add a row.: a spreadsheet that's added to by autonomously spawned legal-research agents. The result is a living record of everything we owe as a service provider, built to surface the facts that would be most damaging not to know.
→ Spindle Bind every downstream user (and their end users) to AUP terms equivalent to Telnyx's plus all named laws — i.e. publish and enforce a Spindle AUP tha… Telnyx AUP TOS;FLOW
→ Spindle Ensure no unsolicited calls/messages/emails through the account that could reasonably be expected to or do provoke complaints Telnyx AUP CODE
→ User Have a lawful basis/consent and do not send unsolicited messaging that provokes complaints Spindle AUP (TBD) FLOW;CODE
→ Spindle Do not send 10DLC traffic designated or reasonably expected to be designated as spam; register Brand+Campaign as a CSP Telnyx AUP CODE;OPS
→ User Your SMS content/campaign must not be spam and must pass 10DLC registration vetting Spindle AUP (TBD) FLOW;CODE
→ Spindle Comply with CTIA, Mobile Marketing Association, NENA and carrier guidelines / industry standards Telnyx AUP CODE
→ User Your messaging must comply with CTIA/MMA carrier standards (content, opt-out, sender identification) Spindle AUP (TBD) FLOW
→ Spindle Do not falsify identity, including via synthetic/cloned/AI-generated voice, identity, or persona content Telnyx AUP CODE;UI
→ User Do not use Spindle's AI to impersonate a person/entity or to hide that a communication is AI-assisted where disclosure is required Spindle AUP (TBD) FLOW;UI
→ Spindle Use AI voice/cloning only with prior express authorization; no AI for unauthorized automated outreach/spam; do not circumvent Telnyx safeguards/compl… Telnyx AUP TOS;CODE
→ User Only clone/use a voice with authorization, do not use AI for unauthorized outreach, and do not bypass Spindle's compliance controls Spindle AUP (TBD) FLOW
→ Spindle Comply with CAN-SPAM for commercial email: accurate sender identification, a functioning opt-out, and a physical postal address Telnyx AUP CODE
→ User Your commercial email must honor opt-outs, identify the sender, and include a physical postal address Spindle AUP (TBD) FLOW;CODE
→ Spindle Comply with the TCPA — prior (written, for marketing) consent for autodialed or AI calls and texts Telnyx AUP CODE
→ User Obtain TCPA-compliant prior consent before texting/calling recipients Spindle AUP (TBD) FLOW;CODE
→ Spindle Honor Do-Not-Call requirements Telnyx AUP CODE
→ User Do not contact numbers on applicable do-not-call lists or recipients who have opted out Spindle AUP (TBD) FLOW;CODE
→ Spindle Do not transmit a business-initiated (proactive) message to a number on the FTC National DNC registry without a lawful basis (express written consent… LAW:DNC (Do-Not-Call Implementation Act);LAW:TSR OPEN-RESIDUAL;CODE
→ Spindle Comply with call-recording consent laws (ECPA; single/multi-party state consent) Telnyx AUP FLOW;CODE
→ User Obtain required consent before recording calls (two-party-consent states) Spindle AUP (TBD) FLOW;UI
→ Spindle Comply with recording-consent law for VOICEMAIL-BASIS message capture (capacity-overflow OR after-hours) Telnyx AUP FLOW;CODE
→ User Use an unambiguous voicemail / after-hours prompt so the caller knows they are leaving a message on an automated system Spindle AUP (TBD) UI;FLOW
→ Spindle Use Services only for lawful/proper purposes; no fraud, deception, harassment, IP infringement, malware/DoS, unauthorized access, CLI spoofing, or pr… Telnyx AUP CODE;TOS
→ User Do not use Spindle for any unlawful, fraudulent, deceptive, harassing, or infringing purpose, to transmit malware, or to run prohibited schemes Spindle AUP (TBD) FLOW
→ Spindle Comply with data-privacy (GDPR), export/sanctions (OFAC SDN, embargoed countries, denied-persons), and anti-bribery (FCPA) laws Telnyx AUP TOS;VENDOR;CODE
→ User Comply with applicable privacy, sanctions, and anti-bribery laws in your use of Spindle Spindle AUP (TBD) FLOW
→ Spindle Number hygiene: keep numbers actively used (no hoarding/parking/warehousing), maintain a healthy answer-seizure rate (ASR), stay within calls-per-sec… Telnyx AUP CODE-PARTIAL;MONITORING-PENDING
→ Spindle Do not operate an open mail relay, present upstream/third-party traffic for onward transmission (no wholesale arbitrage), or spoof CLI Telnyx AUP OPS
→ Spindle Telnyx may suspend, surcharge, or reclaim our numbers at sole discretion for violations — by Spindle OR our users Telnyx AUP CODE
→ Spindle Use the Outscraper API and any extracted data only for lawful, authorized purposes; do not violate any laws in your jurisdiction or infringe Outscrap… VENDOR:Outscraper ToS TOS;FLOW;CODE
→ User Spindle's AUP must bind users to lawful-use-only of discovered/enriched data: no unlawful purpose, no IP infringement Spindle AUP (TBD) FLOW;TOS
→ Spindle As Data Controller of scraped personal data (Outscraper = Data Processor on your instructions): maintain a lawful basis (consent/legitimate interest)… VENDOR:Outscraper GDPR Information TOS;FLOW;CODE
→ User Spindle's AUP must make the user the Data Controller responsible for lawful basis + DSAR/erasure on the leads they act on; Spindle supplies the prove… Spindle AUP (TBD) FLOW;CODE;DOC
→ Outscraper Indemnify, defend and hold Outscraper harmless from any third-party claim arising out of Spindle's breach of the ToS or violation of any law or third… VENDOR:Outscraper ToS TOS
→ Spindle Spindle's ToS must make the user indemnify Spindle for the user's misuse of discovered/enriched data, mirroring Outscraper's indemnity downstream (fa… Spindle ToS (TBD) TOS;FLOW
→ Spindle Customer controls the data it extracts (Outscraper = Processor on instructions), so Spindle may RETAIN and reuse extracted data (the map-backfill see… VENDOR:Outscraper (GDPR controller model + API results-expiry) OPS;CODE
→ Spindle Every SMS the platform sends carries a 'Msg & data rates may apply' disclosure (CTIA messaging best-practice / carrier 10DLC requirement) STD:CTIA Messaging Principles / A2P-10DLC CODE
→ Spindle Every automated SMS conversation declares it is an automated/AI system AND offers opt-out (STOP) — an immovable server-injected floor the operator ca… LAW:TCPA / STD:CTIA / FLOW-CANVAS D-FC-5/17 CODE
→ Spindle When an inbound reply is AI-generated (mirrored mode), the message discloses it is AI-assisted (reinforces OB-8 no-hiding-AI for the improvised-reply… VENDOR:Telnyx AUP (falsification/AI clause) + AI-disclosure norms / FLOW-CANVAS D-FC-15 CODE;UI
→ User Spindle's AUP must bind the operator not to hide that an inbound email/SMS reply is AI-assisted when running mirrored mode — the email+SMS flow-down … Spindle AUP (TBD) FLOW;TOS
→ Spindle All outbound + conversation-flow copy is screened against a professional-conduct content floor (slurs / strong profanity, with evasion normalization)… Spindle content policy (self-imposed; U3/V20 extension) / FLOW-CANVAS D-FC-10 CODE
→ User Spindle's AUP must bind the operator not to author flow / outbound content that violates the professional-conduct floor (the screen is non-neuterable… Spindle AUP (TBD) FLOW;TOS
→ Spindle An SMS STOP/opt-out revokes consent for BOTH texts and calls to that phone number — so a STOP ever received on a number must suppress outbound VOICE … LAW:TCPA (revocation of consent covers calls+texts to that number) / STD:CTIA CODE;UI
→ User Spindle's AUP must bind the administrator [= the Spindle SUPER-ADMIN; outbound voice is a concealed developer-only capability NOT offered to tenants]… Spindle AUP (TBD) / flow-down of OB-025a (LAW:TCPA) TOS;CODE
→ Spindle The ACCOUNT-level facilitator attestation IS the wholly-inclusive grant: it embeds an Acceptable Use clause binding the operator to the named laws + … Spindle ToS — ACCOUNT_BASE_ATTESTATION (USECASE-DERIVE D-UCD-1/3/7); realizes OB-001 + OB-019 TOS;FLOW;CODE
→ User By signing the account attestation the operator agrees to the Acceptable Use Policy + named-law compliance, indemnifies Spindle (including for vendor… Spindle ToS — ACCOUNT_BASE_ATTESTATION + Representations Schedule (USECASE-DERIVE D-UCD-3/4/8) TOS;FLOW
→ Spindle Use the ZeroBounce email-verification API + returned data only for lawful, authorized purposes; the operator is the Data Controller of the email addr… VENDOR:ZeroBounce ToS + Privacy/DPA TOS;FLOW;CODE
→ User Spindle's AUP must bind the operator to lawful-use + Data-Controller duties (lawful basis / minimization / DSAR / erasure) over the email addresses t… Spindle AUP (TBD) / flow-down of OB-027a FLOW;TOS
→ Spindle Use the NeverBounce email-verification API + returned data only for lawful, authorized purposes; the operator is the Data Controller of the email add… VENDOR:NeverBounce (ZoomInfo) ToS + DPA TOS;FLOW;CODE
→ User Spindle's AUP must bind the operator to lawful-use + Data-Controller duties (lawful basis / minimization / DSAR / erasure) over the email addresses t… Spindle AUP (TBD) / flow-down of OB-028a FLOW;TOS
→ Spindle Restrict automated SMS to the recipient's permitted calling hours (per-jurisdiction quiet-hours window) — an immovable server-side floor the operator… LAW:TCPA calling-time restrictions + state analogs CODE
→ Spindle Use SES email receiving + S3/SQS/SNS only per the AWS Service Terms and AUP (lawful content, abuse handling, no prohibited use); Spindle processes th… VENDOR:AWS Service Terms + AUP (+ DPA) TOS;FLOW;CODE
→ User Spindle's AUP must bind the operator to forward ONLY mailboxes they own/control to their intake address, to hold the lawful basis for Spindle process… Spindle AUP (TBD) / flow-down of OB-030a FLOW;TOS
→ User Advise + optionally gate proactive SMS on AGED consent-of-record: a configurable per-workspace warn/hold/block on consent older than a threshold (def… SELF-IMPOSED (product safety); grounded in relationship-recency norms CODE
→ Spindle Use the Notion API only per the Notion API Terms + Developer Terms (authorized workspace access, rate limits, no misuse); Spindle acts as a FACILITAT… VENDOR:Notion API Terms + Developer Terms TOS;FLOW;CODE
→ User Spindle's AUP/ToS must bind the operator to connect ONLY a Notion workspace/data source they OWN and are AUTHORIZED to write to — Spindle is a facili… AUP flow-down of OB-032 (Notion API Terms authorized access) TOS;FLOW
→ Spindle Receiving inbound Notion integration-webhook event METADATA (event id/type/timestamp, workspace/subscription/integration ids, page entity.id) is proc… VENDOR:Notion API + Developer Terms 2.1/3.1; GDPR Arts. 4-6/13-17/28/32 TOS;FLOW;CODE
→ User Spindle's AUP/ToS must bind the operator to enable inbound receipt ONLY for a Notion workspace they OWN and are AUTHORIZED to receive events from - t… AUP flow-down of OB-032c (Notion Developer Terms prior-written-End-User-consent + authorized access) TOS;FLOW
→ User Disclose the Microsoft Graph intake consent-boundary asymmetry vs the IMAP twin: under Graph the ingest floor is enforced CLIENT-side (option B, unfi… SELF-IMPOSED (consent-boundary posture); Microsoft Graph message-delta contract (no safe server-side $filter — the 5,000 cap in unguaranteed order would silently lose mail) CODE;FLOW
→ Spindle Use Microsoft Graph only per the Microsoft APIs Terms of Use + Microsoft Graph terms (authorized delegated access, rate limits, no misuse); the intak… VENDOR:MS-Graph APIs Terms of Use + Microsoft Graph terms TOS;FLOW;CODE
→ User Spindle's AUP/ToS must bind the operator to connect ONLY a Microsoft/IMAP mailbox they OWN and are AUTHORIZED to read, to hold the lawful basis for S… Spindle AUP (TBD) / flow-down of OB-034a FLOW;TOS
→ Spindle Use the Zoho CRM API only per the Zoho CRM API Terms of Service + Developer/API Policy (authorized org access via OAuth, requested scopes only, per-o… VENDOR:Zoho CRM API ToS + Developer/API Policy TOS;FLOW;CODE
→ User Spindle's AUP/ToS must bind the operator to connect ONLY a Zoho CRM organization they OWN and are AUTHORIZED to access + write to — Spindle is a faci… AUP flow-down of OB-035 (Zoho API Terms authorized access) TOS;FLOW
→ User For the writing-style personalization feature: retain only a DISTILLED style guide (closed-vocabulary axes), NEVER the raw writing samples (transient… SELF-IMPOSED (www privacy promise; product trust); DESIGN-SWEEP-1 B C-367 CODE;UI
→ Spindle Google Maps Platform terms: Places API Content may not be persisted beyond the permitted caching window (the repo already models 30 days for most con… VENDOR:Google-Maps-Platform (Places API (New) — content caching limits + the place_id exemption) CODE-PARTIAL;OPEN-RESIDUAL;FLOW
→ User Spindle's AUP/ToS must bind the operator not to re-persist, redistribute, or republish Google Maps Platform Content received through Spindle (lead ex… AUP flow-down of OB-036a (Google Maps Platform content-caching terms) TOS;FLOW
→ Spindle Yelp Fusion Display & Storage requirements: Spindle may not store any portion of Yelp Content beyond 24 h (business IDs excepted), and must honor a d… VENDOR:Yelp Fusion API Terms (Display & Storage requirements) OPEN-RESIDUAL;FLOW
→ User Spindle's AUP/ToS must bind the operator to clear the live Yelp Fusion Display & Storage terms THEMSELVES before enabling the Yelp source (setting YE… AUP flow-down of OB-037a (Yelp Fusion Display & Storage requirements) TOS;FLOW
→ Spindle Meta Platform Terms + Graph API (Pages): automated collection of Page data needs express written permission, which fields a non-owning app may read i… VENDOR:Meta Platform Terms + Graph API (Pages) app-review & storage terms OPEN-RESIDUAL;FLOW
→ User Spindle's AUP/ToS must bind the operator to clear Meta app-review + storage terms themselves before enabling the Facebook/Instagram source (setting F… AUP flow-down of OB-038a (Meta Platform Terms / Graph API Pages) TOS;FLOW
→ Spindle ODbL 1.0: OSM-sourced data requires ATTRIBUTION — '(c) OpenStreetMap contributors, ODbL' — on ANY public export or display of OSM-sourced leads, and … VENDOR:OpenStreetMap (ODbL 1.0 — attribution + share-alike) OPEN-RESIDUAL;FLOW
→ Spindle Retain the required redistribution notices and license texts when the authenticated-web Map View bundles MapLibre GL JS and PMTiles (BSD-3), Noto gly… VENDOR:MapLibre GL JS BSD-3; VENDOR:Protomaps PMTiles BSD-3; VENDOR:Noto OFL-1.1; VENDOR:Tangram Icons MIT NOTICE;DOCS
→ User Spindle's AUP/ToS must bind the operator to carry the ODbL attribution '(c) OpenStreetMap contributors, ODbL' onward on any public display or export … AUP flow-down of OB-039a (ODbL 1.0 attribution + share-alike) TOS;FLOW
→ Spindle SUPERSEDED / PENDING-COUNSEL (MAP-COVERAGE-SCOPE/DO-C2): the earlier single-license CDLA-Permissive-2.0 premise is withdrawn. Overture Places is a li… SUPERSEDED / PENDING-COUNSEL: the former Overture-only source/provenance premise is incomplete; exact source documents and per-release provenance mapping await the license/display owner and counsel. OPEN-RESIDUAL;FLOW;CODE-PARTIAL;SUPERSEDED;PENDING-COUNSEL
→ User SUPERSEDED / PENDING-COUNSEL (MAP-COVERAGE-SCOPE/DO-C2): the exact Spindle-to-user flow-down for Overture Places is not asserted until the license mi… SUPERSEDED / PENDING-COUNSEL: former flow-down derivation from a single CDLA-Permissive-2.0 premise is incomplete. TOS;FLOW;SUPERSEDED;PENDING-COUNSEL
→ Spindle SUPERSEDED / PENDING-COUNSEL (MAP-COVERAGE-SCOPE/DO-C2 and DO-C4): the prior absolute claim that Geoapify prohibits raw queryable redistribution is c… SUPERSEDED / PENDING-COUNSEL: the current Geoapify and ODbL provenance/term record needs exact provider-plan and source-document confirmation. OPEN-RESIDUAL;FLOW;SUPERSEDED;PENDING-COUNSEL
→ User SUPERSEDED / PENDING-COUNSEL (MAP-COVERAGE-SCOPE/DO-C2 and DO-C4): the exact user-facing Geoapify/OSM attribution, share-alike, and redistribution fl… SUPERSEDED / PENDING-COUNSEL: former flow-down derivation included the contested raw-redistribution prohibition. TOS;FLOW;SUPERSEDED;PENDING-COUNSEL
→ Spindle SUPERSEDED / PENDING-COUNSEL (MAP-COVERAGE-SCOPE/DO-C2): the hardcoded © 2024 Foursquare credit in the prior obligation is stale. The exact current c… SUPERSEDED / PENDING-COUNSEL: the prior Foursquare source record embeds a stale hardcoded year; refresh the source/NOTICE provenance before public enable. NOTICE;CODE;FLOW;SUPERSEDED;PENDING-COUNSEL
→ User SUPERSEDED / PENDING-COUNSEL (MAP-COVERAGE-SCOPE/DO-C2): the hardcoded © 2024 Foursquare credit in the prior user flow-down is stale. The exact curre… SUPERSEDED / PENDING-COUNSEL: former flow-down cites the stale hardcoded Foursquare year. TOS;FLOW;SUPERSEDED;PENDING-COUNSEL
→ Spindle Spindle's own first-party marketing email (the SAG2 free-tier teaser) is full commercial email under FTC primary-purpose doctrine even though it mark… LAW:CAN-SPAM (15 U.S.C. Sec.7701 et seq.) + FTC primary-purpose marketing-classification doctrine CODE
→ Spindle One unsubscribe from Spindle's first-party marketing (the teaser, or any future first-party marketing sender) suppresses that recipient across ALL Sp… LAW:CAN-SPAM (opt-out honoring window) + Spindle self-imposed structural-separation control CODE
→ Spindle Spindle's first-party marketing (the SAG2 teaser) targets a US-only audience for v1; sending to EU (GDPR) or Canadian (CASL) recipients requires PRIO… LAW:CASL (Canada Anti-Spam Legislation - prior express/implied consent for commercial electronic messages) + LAW:GDPR (EU - consent/legitimate-interest basis required for direct marketing) OPEN-RESIDUAL;TOS
→ Spindle The ONLY discovery source SAG2 persists a row from - for BOTH the free-tier teaser (spindle_teaser_sends) and the Pro sell-findings table (spindle_se… SELF-IMPOSED (extends the license-risk posture at OB-039a VENDOR:OpenStreetMap ODbL 1.0, and OB-040a VENDOR:Overture Maps Foundation CDLA-Permissive-2.0) CODE
→ Spindle Use the Airtable Web API only per the Airtable API Terms + Developer Policy (authorized base access via OAuth or a PAT, requested scopes only - webho… VENDOR:Airtable Web API Terms + Developer Policy (webhook API - create/refresh/delete, HMAC, rate/webhook caps) TOS;FLOW;CODE
→ User AUP flow-down (Spindle -> User): Spindle's AUP/ToS must bind the operator to connect ONLY an Airtable base they OWN and are AUTHORIZED to access. Con… AUP flow-down of OB-47a (Airtable API Terms authorized access) TOS;FLOW
→ Spindle When an automated/AI system communicates online with a person to incentivize a sale or transaction (or to influence a vote), it must not mislead the … LAW:CA SB 1001 (Bolstering Online Transparency, effective 2019-07-01) - the AI-disclosure floor SB 1001 mandates CODE
→ Spindle As CONTROLLER, notify the competent supervisory authority of a personal-data breach without undue delay and, where feasible, within 72 hours of becom… LAW:GDPR Art. 33(1)(3)(4)(5) OPS;OPEN-RESIDUAL
→ Spindle As PROCESSOR for a tenant, notify that tenant (the controller) without undue delay after becoming aware of a breach affecting their data, so the cont… LAW:GDPR Art. 33(2) OPS;OPEN-RESIDUAL
→ Spindle As CONTROLLER, when a breach is likely to result in a HIGH risk to the rights and freedoms of natural persons, communicate it to the affected data su… LAW:GDPR Art. 34(1)(2)(3) OPS;OPEN-RESIDUAL
→ Spindle Keyword text-in enrollment into recurring automated marketing requires the PEWC (prior express written consent) disclosures AT CAPTURE: the CTA/adver… LAW:TCPA (47 CFR 64.1200(f) PEWC);STD:CTIA;STD:A2P-10DLC CODE;FLOW
→ User Spindle's AUP/ToS + the in-product CTA attestation must bind the merchant to display ONLY an approved CTA/advertisement carrying the PEWC disclosures… Spindle AUP (TBD) / flow-down of OB-050a FLOW;TOS;CODE
→ Spindle Text-in consent is SELLER-SPECIFIC and non-transferable: a consent captured for merchant A must never authorize a send by merchant B, consent must no… LAW:TCPA (seller-specific consent);STD:CTIA;STD:A2P-10DLC (one brand per campaign) CODE;FLOW
→ User Spindle's AUP/ToS must bind the merchant to use text-in consent only for its OWN sends, never to transfer or reuse another merchant's consent, and ne… Spindle AUP (TBD) / flow-down of OB-051a FLOW;TOS
→ Spindle An automated SMS program must answer HELP with a BRANDED help response (brand + support contact + frequency + rates + STOP) and must honor STOP / REV… LAW:TCPA;STD:CTIA (HELP/STOP required keywords) CODE;FLOW
→ User Spindle's AUP must bind the merchant to keep an accurate HELP support contact on file (a program with no HELP config cannot activate) and never to au… Spindle AUP (TBD) / flow-down of OB-052a FLOW;TOS
→ Spindle Numbers/consent captured for a text-in program are used only to message that recipient for THAT seller's program and are NOT sold or shared with thir… STD:CTIA;STD:A2P-10DLC (no-third-party-sharing consent term);LAW:TCPA FLOW;CODE
→ User Spindle's AUP/ToS must bind the merchant not to sell or share the phone numbers/consent captured through a Spindle text-in program with third parties… Spindle AUP (TBD) / flow-down of OB-053a FLOW;TOS
→ Spindle Guard against messaging a REASSIGNED or deactivated number: process carrier reassignment/deactivation (RND) signals so a consent captured for one sub… LAW:TCPA (reassigned-number safe harbor);STD:A2P-10DLC OPS;OPEN-RESIDUAL
→ Spindle Keep D15 lead-source stripping distinct from completed data-subject erasure: raw contact_lead_fills self-purge at lead redaction; retained source-str… LAW:GDPR Art. 5(1)(c)/(e), Art. 11, Art. 30; LAW:CCPA §§1798.105(c)(2), 1798.145(j); D15 owner decisions CODE;DOC;OPEN-RESIDUAL
→ Spindle Before enabling per-contact consent screenshots, process image bytes, embedded metadata, and authenticated uploader provenance only for the recorded-… LAW:GDPR Arts. 5, 13–14, 17–18, 32;LAW:CCPA §§1798.100(a),(c),(e), 1798.105, 1798.140(v)(4),(ae) CODE;FLOW;OPS;OPEN-RESIDUAL
→ User Spindle's AUP/ToS and the in-product evidence attestation must bind an operator to attach only the one contact's opt-in evidence, avoid unrelated con… Spindle AUP (TBD) / flow-down of OB-055a FLOW;TOS;CODE;OPEN-RESIDUAL
→ Spindle Migration validation and any carrier-observed MPS collection must not create an unapproved or duplicate recipient contact, must preserve opt-out/cons… Telnyx AUP unsolicited-messaging / compliance-controls clauses; TCPA; CTIA CODE-PARTIAL;OPS;OPEN-RESIDUAL
→ User An operator must authorize migration activity only for its own data and may not use a migration or test run to contact unapproved recipients, relabel… Spindle AUP (TBD) — flow-down of OB-059a FLOW;TOS;CODE-PARTIAL;OPEN-RESIDUAL
→ Spindle As a Google OAuth client, comply with Google's API Services User Data Policy + OAuth 2.0 Policies: request the minimum identity scopes, present accur… VENDOR:Google (API Services User Data Policy + OAuth 2.0 Policies) CODE;OPEN-RESIDUAL
→ Spindle Comply with the Apple Developer Program License Agreement + Sign in with Apple guidelines/HIG: use a verified HTTPS return domain, generate a per-exc… VENDOR:Apple (Developer Program License Agreement + Sign in with Apple guidelines/HIG) CODE;OPEN-RESIDUAL
→ User The guest / free-fly onboarding makes Spindle-to-user promises whose accuracy Spindle must maintain and whose wording its ToS/notices must carry: (1)… SELF-IMPOSED (ONB1 facilitator posture) — the Spindle->user notice/flow-down anchor for the ONB1 consumer surface FLOW;CODE;OPEN-RESIDUAL
→ Spindle For the two separately-consented recurring products (base tier and monthly-prepaid minutes), provide clear-and-conspicuous terms before consent, affi… LAW:ROSCA;LAW:FTC-§5;LAW:CA-BPC-§17602 CODE;UI;TOS;OPEN-RESIDUAL
→ Spindle Off-session auto-top-up or stay-live authorization cannot rely on a SetupIntent alone: identify the saved method, trigger (balance < $10), formula (t… LAW:Reg-E;STD:Nacha;STD:card-network CODE;UI;OPEN-RESIDUAL
→ Spindle Price displays must absorb rather than surcharge the card fee ('$20 adds $20'); state the +2% ACH amount as exact extra credit; qualify '$0.75/min' a… LAW:FTC-§5;LAW:state-total-price;LAW:CA-CivCode-1748.1;LAW:15-USC-1693o-2;STD:card-network UI;TOS;OPEN-RESIDUAL
→ Spindle Maintain the stored-value posture: closed-loop issuer-only, no transfer/P2P, a proposed $2,000 balance ceiling, and dormancy/escheat handling; distin… LAW:state-stored-value;LAW:FinCEN-prepaid-access TOS;OPS;OPEN-RESIDUAL
→ Spindle As seller of record, determine nexus, registration, product classification, filing/remittance, and communications-tax treatment; Stripe Tax calculate… LAW:Wayfair;LAW:FCC-USAC;LAW:state-communications-tax VENDOR;OPS;OPEN-RESIDUAL
→ Spindle Publish and implement refund, cancellation, chargeback, negative-balance, and statement-descriptor terms: cancel anytime with no refund; wallet value… SELF-IMPOSED (PAY3 SA5);STD:card-network TOS;CODE;OPEN-RESIDUAL
→ Spindle Before any live Stripe rail, keep the product profile outside Stripe-defined telemarketing (cold outbound solicitation): warm, opt-in, consented SaaS… VENDOR:Stripe;STD:PCI-DSS-v4.0.1 VENDOR;OPS;OPEN-RESIDUAL
→ User Spindle ToS must bind the customer: wallet value is service-credit-only, non-transferable, non-cash-redeemable, with no third-party/P2P redemption an… Flow-down of OB-066a;SELF-IMPOSED (PAY3 SA4/SA5) TOS;OPEN-RESIDUAL
→ User Before any live paid rail, Spindle ToS/payment notices must state cancellation-anytime/no-refund, chargeback and dispute handling with signed-ledger … Flow-down of OB-065;SELF-IMPOSED (PAY3 SA5);STD:card-network TOS;OPEN-RESIDUAL
→ User Before any live Stripe rail, customer AUP/ToS must bind every customer to use Spindle only for warm, opt-in, consented communications and never for S… Flow-down of OB-066a;VENDOR:Stripe;SELF-IMPOSED (PAY3 D4 OWNER OPTION 3 NARROW) TOS;OPEN-RESIDUAL
→ Spindle Contact-send may text a saved contact ONLY on a defensible prior-express-written-consent basis that the specific person authorized THAT specific numb… LAW:TCPA (prior express written consent);STD:A2P-10DLC; SOL consult 2026-09-02 (F2 verified identifier) CODE;DOC
→ Spindle listed_public (a publicly-listed number) may NEVER count as consent for a person-directed contact send — no cold SMS to a person; contact-send must r… LAW:TCPA (no cold SMS); SOL consult 2026-09-02 (F1 confirmed claim: listed_public passes the lead proactive gate with no consent record) CODE
→ Spindle Recipient-keyed locale + quiet-hours precedence: declared -> verified -> strictest; an unknown or conflicting locale means NO send; a US-only country… LAW:TCPA (8am-9pm recipient local time);STD:A2P-10DLC; SOL consult 2026-09-02 (F3 locale/quiet) CODE
→ Spindle A shared line (a number held by more than one live contact) fails CLOSED: a first contact is withheld to avoid reaching the wrong person; per-holder … LAW:TCPA (right-party contact); SOL consult 2026-09-02 (F2 shared lines fail-closed) CODE;OPEN-RESIDUAL
→ Spindle Every contact send immutably snapshots its authorization evidence at send time: contact_id, identifier_id, address, business, campaign, consent basis… LAW:GDPR Art.30 (records of processing);LAW:TCPA (proof of consent at send); SOL consult 2026-09-02 (F4 per-send snapshot) CODE
→ Spindle Contact EMAIL is out of scope for CONTACT-SEND and is rejected at the API AND the UI; the separate CAN-SPAM regime (unsubscribe <=10 business days, c… LAW:CAN-SPAM; SOL consult 2026-09-02 (F5 SMS-only, reject contact email) CODE;DOC
→ Spindle Field-level sourcing + licensing flow-down for a sourced identifier: retain source/vendor/license metadata + a retention deadline (append-only is not… VENDOR:(each data source/licensor); LAW:GDPR Art.14; SOL consult 2026-09-02 (missed exposure: field-level sourcing/licensing) CODE;OPEN-RESIDUAL
→ User Spindle->user erasure/DSAR posture for contact-send PII: on a data-subject erasure the OTP challenges are deleted, the verification declared-location… SELF-IMPOSED (facilitator/controller posture); LAW:GDPR Art.5/17(3)(e)/Art.14, CCPA 1798.105; SOL consult 2026-09-02 (missed exposure: erasure/DSAR minimized retention) CODE;DOC;OPEN-RESIDUAL
The hard part
Making a complex product feel manageable.
The engine was built first. For almost a month there was no interface at all — just the state machine, the consent gates, the three channels, all tested offline with fakes. I'd gone for the all-in-one AI tool before I'd asked how anyone would actually use it.
Then came the part that proved hardest: designing an interface that put all of it in front of a small-business owner without overwhelming them. Voice, text, email, agents, cadences, compliance — every one of them wanted its own screen. Making the cockpit intuitive rather than overwhelming, with nothing hidden but nothing shouting, has been as difficult as researching and developing the product.
Engineering roadmap · generated from GitHub (private)
213 / 259systems built, tested and merged
Outcome
One front desk across three channels.
Spindle is now more than 250,000 lines of Rust across six crates: the engine, the desktop cockpit, a hosted multi-tenant server, a headless daemon, a CLI and an MCP server for agents. Every one of the 213 shipped systems has its own spec, tests that run offline against fakes, and a database migration; the schema is past its 150th.
What that buys a small business is one assistant on three channels that will not send a message the law does not allow. It is in daily development, with paying customers next.
Competitor offers
Animated explainer · multi-channel architecture
The call, the text, and the email about one customer land on a single strand — so nothing is asked twice, and nothing slips. Plays when it comes into view; click to replay.
User research · who it's for
Who it's for
Audience
The research started with people, not features: who would an AI front desk actually be best for? The answer that kept coming up was anyone whose hands are literally full when the phone rings. Cosmeticians mid-appointment, auto body shops with everyone under a lift, the one-person crew halfway up a ladder. Small businesses where the person answering the phone is also the person doing the work.
So Spindle goes to freelancers and struggling small businesses first, and that choice runs through the whole brand — the copy, the pricing, the calm of the cockpit. The hero line on spindle.chat is the thesis in four words: “Your hands are full.” It speaks to people who feel overwhelmed by their phone, not to people excited about AI.



Identity · the mark and the app hub
Four passes to the ring, then everything it connects to.
The integrations orbit as it lives on spindle.chat, and the logo's evolution from stacked lines to the ring-and-plane mark that shipped.
Identity · process recordings
Working through the identity.
Explore the Spindle design recordings. Use the arrows to switch between sessions.
This recording couldn’t load. Open the video directly ↗
Design system · colour, type, components, mark
One theme sheet, every surface.
The locked palette, three type roles and the component set they colour, assembled as one sheet before a line of the cockpit's styles was written.
Spindle Operators · partner program
A partner offer grounded in research.
Partners sell Spindle under their own brand, with an offer shaped by competitor research and a detailed earnings model.
- Compared with GoHighLevel, Twilio, and other partner programs.
- Recurring earnings modeled against customer growth, churn, and support time.
- No joining fees or recruitment commissions: earnings come from customer revenue.