← All projects Project / 02

Product · 2026

Spindle

Automates live agents over voice, text, and email channels, for small businesses and freelancers.

Spindle desktop settings on a laptop beside the mobile app's shared conversation and draft approval screen.
Spindle on desktop and mobile.

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.

Dish Network · 2017 · robocalls$280M
Capital One · 2014 · autodialer$75.5M
Caribbean Cruise Line · 2016 · prerecorded$76M
Papa John's · 2013 · texts$16.3M
The cost of getting consent wrong: statutory damages & publicly reported settlements.

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.

Spindle cockpit — Dashboard Spindle cockpit — Voice receptionist config Spindle cockpit — Call Log with consent status Spindle cockpit — Calendar of booked and held slots
One cockpit, three channels — dashboard, the voice receptionist, the call log and the calendar it books into.

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 Ledger: 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.

docs/product/obligation_ledger.csv124 obligations · scroll ↓
idfrom → toobligationsourcevia
OB-001 Telnyx
→ 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
OB-002a Telnyx
→ Spindle
Ensure no unsolicited calls/messages/emails through the account that could reasonably be expected to or do provoke complaints Telnyx AUP CODE
OB-002b Spindle
→ User
Have a lawful basis/consent and do not send unsolicited messaging that provokes complaints Spindle AUP (TBD) FLOW;CODE
OB-003a Telnyx
→ 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
OB-003b Spindle
→ User
Your SMS content/campaign must not be spam and must pass 10DLC registration vetting Spindle AUP (TBD) FLOW;CODE
OB-004a Telnyx
→ Spindle
Comply with CTIA, Mobile Marketing Association, NENA and carrier guidelines / industry standards Telnyx AUP CODE
OB-004b Spindle
→ User
Your messaging must comply with CTIA/MMA carrier standards (content, opt-out, sender identification) Spindle AUP (TBD) FLOW
OB-005a Telnyx
→ Spindle
Do not falsify identity, including via synthetic/cloned/AI-generated voice, identity, or persona content Telnyx AUP CODE;UI
OB-005b Spindle
→ 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
OB-006a Telnyx
→ 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
OB-006b Spindle
→ 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
OB-007a Telnyx
→ Spindle
Comply with CAN-SPAM for commercial email: accurate sender identification, a functioning opt-out, and a physical postal address Telnyx AUP CODE
OB-007b Spindle
→ User
Your commercial email must honor opt-outs, identify the sender, and include a physical postal address Spindle AUP (TBD) FLOW;CODE
OB-008a Telnyx
→ Spindle
Comply with the TCPA — prior (written, for marketing) consent for autodialed or AI calls and texts Telnyx AUP CODE
OB-008b Spindle
→ User
Obtain TCPA-compliant prior consent before texting/calling recipients Spindle AUP (TBD) FLOW;CODE
OB-009a Telnyx
→ Spindle
Honor Do-Not-Call requirements Telnyx AUP CODE
OB-009b Spindle
→ User
Do not contact numbers on applicable do-not-call lists or recipients who have opted out Spindle AUP (TBD) FLOW;CODE
OB-009c LAW:DNC;LAW:TSR
→ 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
OB-010a Telnyx
→ Spindle
Comply with call-recording consent laws (ECPA; single/multi-party state consent) Telnyx AUP FLOW;CODE
OB-010b Spindle
→ User
Obtain required consent before recording calls (two-party-consent states) Spindle AUP (TBD) FLOW;UI
OB-010c Telnyx
→ Spindle
Comply with recording-consent law for VOICEMAIL-BASIS message capture (capacity-overflow OR after-hours) Telnyx AUP FLOW;CODE
OB-010d Spindle
→ 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
OB-011a Telnyx
→ 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
OB-011b Spindle
→ 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
OB-012a Telnyx
→ Spindle
Comply with data-privacy (GDPR), export/sanctions (OFAC SDN, embargoed countries, denied-persons), and anti-bribery (FCPA) laws Telnyx AUP TOS;VENDOR;CODE
OB-012b Spindle
→ User
Comply with applicable privacy, sanctions, and anti-bribery laws in your use of Spindle Spindle AUP (TBD) FLOW
OB-013 Telnyx
→ 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
OB-014 Telnyx
→ 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
OB-015 Telnyx
→ Spindle
Telnyx may suspend, surcharge, or reclaim our numbers at sole discretion for violations — by Spindle OR our users Telnyx AUP CODE
OB-017a Outscraper
→ 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
OB-017b Spindle
→ 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
OB-018a Outscraper
→ 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
OB-018b Spindle
→ 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
OB-019a Spindle
→ 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
OB-019b User
→ 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
OB-020 Outscraper
→ 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
OB-021 CTIA
→ 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
OB-022 TCPA;CTIA
→ 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
OB-023a Telnyx;AI-disclosure
→ 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
OB-023b Spindle
→ 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
OB-024a Spindle (self-imposed)
→ 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
OB-024b Spindle
→ 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
OB-025a TCPA;CTIA
→ 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
OB-025b Spindle
→ 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
OB-026a Spindle (self-imposed; realizes OB-001/OB-019)
→ 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
OB-026b Spindle
→ 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
OB-027a ZeroBounce
→ 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
OB-027b Spindle
→ 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
OB-028a NeverBounce
→ 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
OB-028b Spindle
→ 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
OB-029 TCPA;state law
→ 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
OB-030a AWS
→ 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
OB-030b Spindle
→ 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
OB-031 Spindle (self-imposed)
→ 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
OB-032 Notion
→ 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
OB-032b Spindle
→ 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
OB-032c Notion
→ 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
OB-032d Spindle
→ 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
OB-033 Spindle (self-imposed)
→ 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
OB-034a Microsoft
→ 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
OB-034b Spindle
→ 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
OB-035 Zoho
→ 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
OB-035b Spindle
→ 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
OB-035 Spindle (self-imposed)
→ 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
OB-036a Google (Maps Platform)
→ 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
OB-036b Spindle
→ 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
OB-037a Yelp
→ 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
OB-037b Spindle
→ 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
OB-038a Meta (Facebook / Instagram)
→ 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
OB-038b Spindle
→ 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
OB-039a OpenStreetMap Foundation (ODbL)
→ 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
OB-055 MapLibre GL JS / Protomaps PMTiles / Noto Project / Mapzen
→ 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
OB-039b Spindle
→ 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
OB-040a Overture Maps Foundation
→ 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
OB-040b Spindle
→ 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
OB-041a Geoapify (OSM-derived, ODbL 1.0)
→ 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
OB-041b Spindle
→ 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
OB-042a Foursquare Labs, Inc. (Apache-2.0)
→ 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
OB-042b Spindle
→ 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
OB-043 LAW:CAN-SPAM
→ 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
OB-044 Spindle (self-imposed); LAW:CAN-SPAM
→ 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
OB-045 LAW:CASL;LAW:GDPR
→ 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
OB-046 Spindle (self-imposed)
→ 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
OB-047a Airtable
→ 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
OB-047b Spindle
→ 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
OB-048 LAW:CA SB 1001 (Bolstering Online Transparency Act, B&P Code 17940-17943)
→ 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
OB-049a LAW:GDPR (Art. 33)
→ 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
OB-049b LAW:GDPR (Art. 33(2))
→ 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
OB-049c LAW:GDPR (Art. 34)
→ 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
OB-050a TCPA;CTIA;A2P-10DLC
→ 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
OB-050b Spindle
→ 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
OB-051a TCPA;CTIA;A2P-10DLC
→ 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
OB-051b Spindle
→ 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
OB-052a TCPA;CTIA
→ 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
OB-052b Spindle
→ 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
OB-053a TCPA;CTIA;A2P-10DLC
→ 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
OB-053b Spindle
→ 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
OB-054 LAW:TCPA;STD:A2P-10DLC
→ 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
OB-055 Spindle (self-imposed control; counsel-debt)
→ 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
OB-055a LAW:GDPR;LAW:CCPA
→ 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
OB-055b Spindle
→ 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
OB-059a Telnyx
→ 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
OB-059b Spindle
→ 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
OB-056a Google (Sign in with Google / OAuth)
→ 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
OB-057a Apple (Sign in with Apple)
→ 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
OB-058 Spindle
→ 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
OB-060 LAW:ROSCA;LAW:FTC-§5;LAW:CA-BPC-§17602 (+ state ARL analogs)
→ 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
OB-061 LAW:Reg-E 12 CFR 1005.10;STD:Nacha;STD:card-network
→ 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
OB-062 LAW:FTC-§5;LAW:state-total-price;LAW:15-USC-1693o-2;STD:card-network
→ 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
OB-063 LAW:state-unclaimed-property;LAW:state-gift-card-stored-value;LAW:FinCEN-prepaid-access
→ 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
OB-064 LAW:Wayfair;LAW:FCC-USAC;LAW:state-communications-tax
→ 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
OB-065 SELF-IMPOSED (PAY3 SA5);STD:card-network
→ 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
OB-066a VENDOR:Stripe;STD:PCI-DSS-v4.0.1
→ 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
OB-066b Spindle
→ 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
OB-067 Spindle
→ 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
OB-068 Spindle
→ 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
OB-069 LAW:TCPA;STD:A2P-10DLC
→ 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
OB-070 LAW:TCPA
→ 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
OB-071 LAW:TCPA (quiet hours);STD:A2P-10DLC
→ 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
OB-072 LAW:TCPA
→ 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
OB-073 LAW:GDPR Art.30;LAW:TCPA
→ 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
OB-074 LAW:CAN-SPAM
→ 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
OB-075 VENDOR:data source/licensor
→ 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
OB-076 Spindle
→ 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 Obligation Ledger — all 124 rows, scroll to read. Every obligation carries who owes it to whom, its legal source, and whether it's discharged in code, in the terms, or flowed down to the user.

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

donebuildingplannedidea / parked
Hosted platform 37
Integrations 31
Compliance 22
Text messaging 19
Core engine 15
Billing & wallet 14
Phone & voice 12
Infrastructure 11
Lead discovery 11
Interface 10
Cockpit 10
Accounts & security 10
Calendar & booking 9
Slack & CRM apps 8
Outreach 8
Lead enrichment 5
Enterprise 5
Mobile & desktop 5
Data 5
Deliverability 4
AI agents 4
Other 3
Research 1
Every system in the roadmap, one tile each, shipped ones in teal. Getting all of that behind twelve sidebar items was the hard part.

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

VoiceSMSEmailBookingTransfer Twilio Smith.ai Ruby Clay Dialpad Spindle
NativeVia integrationNo

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.

A woman at her desk taking a call on her mobile while working at the computer
A woman on the phone, writing a note, with a stack of binders under her arm
An auto shop: a mechanic with a laptop in the foreground while a colleague talks to a customer at a car on the lift
The people the site is shot for, from spindle.chat's own photography: mid-call, mid-everything, hands on the work.

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.

Motion graphic from spindle.chat — the app hub, showing every service Spindle integrates with.

Identity · process recordings

Working through the identity.

Explore the Spindle design recordings. Use the arrows to switch between sessions.

2026-08-14 12-12-06.mkv · full recording · 20:32 · original speed · no audio.

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.

The locked theme sheet, assembling itself — four ramps, three type roles, and the component set they colour.

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.
Explore the earnings modelExcel workbook · scenarios, assumptions & sources
Spindle Operators 01 / 10
Program proposal · 10 slides. Open the full deck ↗
Next project Orchestra
Visit website spindle-www.vercel.app