Two cards, one person.
The assistant reads contacts for overlapping details and surfaces likely duplicates side by side, with the fields that matched marked for review.
crm-leads is an AI assistant for a growing B2B SaaS company whose sales and operations teams are spending too much time on repetitive CRM chores. The company manages a growing number of leads and customer records, and keeping everything organized has become increasingly time-consuming. crm-leads automates the repetitive work: identifying duplicate contacts, categorizing incoming leads, summarizing customer interactions, and updating CRM records.
The assistant is built in Python using LLM APIs, runs on a FastAPI and PostgreSQL backend for data processing, connects to the company's existing CRM through REST APIs, and is deployed to AWS. Its audience is the company's own sales team members and operations team members — internal colleagues, not external customers.
The product's intent is relief and trust: the assistant should behave like a thoughtful colleague who reads carefully and writes things down plainly. Every AI-produced result is presented as a readable, reviewable artifact with its source, so a human always sees what the assistant concluded and can act on it.
crm-leads is a first-party web application with an application-owned identity boundary and a role-aware authorization boundary. Two active human personas use it:
Current delivery includes:
The existing CRM remains the system of record for contacts, leads, and customer interactions. crm-leads reads from and writes to it through its REST APIs; it does not replace it.
Removed from scope
crm-leads is delivered as a first-party web application backed by a first-party API. The application owns user identity: sales and operations team members enroll themselves through Sign Up and verify their identity through Login before reaching any protected working page. Landing, Login, and Sign Up are reachable anonymously; every working page requires a verified session.
Access is role-aware. Sales team members reach Leads and Summaries; operations team members reach Duplicates, Validation, and CRM Updates. This separation reflects the two accepted responsibilities — pipeline-facing lead and summary review versus data-quality and record-update work — and nothing broader.
The existing CRM is an external, provider-owned system reached only through its REST APIs. crm-leads does not host or replace CRM data of record; it reads CRM records, runs AI-assisted processing, and writes accepted updates back through the same REST connection. LLM providers are external services invoked by the Python assistant; their outputs are always surfaced to a human for review rather than silently committed.
Automation runs in the background on the backend. Human review surfaces are first-party pages. No capability in this document is deferred to a future horizon.
FR-1 — AI assistant reduces repetitive CRM work (explicit) As a sales or operations team member, I should have an AI assistant that performs repetitive CRM tasks for me, so that I spend less time on CRM upkeep.
FR-2 — Duplicate contact detection (explicit) As an operations team member, I should have duplicate contacts identified automatically, so that duplicate customer records are surfaced for resolution.
FR-3 — Basic customer data validation (explicit) As an operations team member, I should have basic customer data validation results surfaced for customer records, so that incomplete or malformed data is visible.
FR-4 — Automated lead categorization (explicit) As a sales team member, I should have incoming leads categorized automatically, so that I can see each lead's category without triaging it by hand.
FR-5 — Automated customer interaction summaries (explicit) As a sales team member, I should have customer interactions summarized automatically, so that I can read the gist of an interaction without reconstructing it.
FR-6 — Automated CRM record updates (explicit) As an operations team member, I should have CRM records updated automatically through the CRM REST API, so that records stay current without manual entry.
FR-7 — CRM REST API connection (explicit) As the crm-leads system, I should connect to the existing CRM through its REST APIs, so that the assistant reads and writes real CRM records.
FR-8 — Python and LLM API assistant (explicit) As the crm-leads system, I should implement the assistant in Python using LLM APIs, so that categorization and summarization are produced by an LLM.
FR-9 — FastAPI and PostgreSQL backend (explicit) As the crm-leads system, I should use FastAPI and PostgreSQL for the backend and data processing, so that the assistant's API and durable state run on the specified stack.
FR-10 — AWS deployment (explicit) As the crm-leads system, I should be deployed to AWS, so that the assistant runs in the company's AWS environment.
FR-11 — Self-service enrollment (required_inference) As a sales or operations team member, I should be able to enroll myself on Sign Up with my name, work email, password, and role, so that I can begin using the assistant.
FR-12 — Returning identity verification (required_inference) As a returning sales or operations team member, I should verify my identity on Login, so that I can reach protected CRM assistant pages.
FR-13 — Role-aware authorization (required_inference) As the crm-leads system, I should separate operations data-quality work from sales lead and summary work by role, so that each member reaches the pages for their responsibility.
The visual direction is a warm editorial order inspired by Frank Chimero: cream paper ground, readable serif prose, generous measure, and a few muted warm accents, so a dense CRM assistant feels humane and legible rather than sterile.
Palette (light mode)
| Role | Hex | Use |
|---|---|---|
| Background | #F7F1E4 | Cream paper ground, ~70% of surface |
| Surface | #FFFBF1 | Cards, notes, table rows |
| Text | #241F1A | Warm ink for all reading (≈13:1 on cream) |
| Primary | #A64B2A | Rust: primary actions, active nav marker, illustration line work (≈5.4:1 on cream) |
| Accent | #C99A2E | Mustard: AI-generated markers, tags, focus rings, large marks only |
| Muted | #6F6455 | Dusty blue-grey: secondary metadata, rules |
| Rule | #E3D9C6 | Hairline 1px rules in warm grey |
Surfaces are uncoated paper, never glass. Mustard is used for fills and large marks only, never for small body text.
Typography
clamp(34px, 6vw, 64px); h1 clamp(28px, 4.5vw, 44px); h2 clamp(22px, 3vw, 30px); h3 20px; body 17px; label 13px caps with 0.08em tracking.Shape language
#E3D9C6.0 2px 0 rgba(36,31,26,0.08).Layout
Imagery
Avoid: blue/indigo accents or white-on-white SaaS ground; glassmorphism, gradient blobs, glow effects; identical hover-lift card grids; Inter, Roboto, Arial, Poppins, or system-ui fonts; centred headline + subtext + blue button hero; photographic stock imagery of smiling salespeople; heavy drop shadows or neon data viz.
Readability constraint: headlines, wordmarks, labels, numbers, cards' text, and controls stay entirely inside the viewport and their container at 375px, 768px, and 1280px, wrapping or scaling to fit; no other element covers any part of them. Imagery and decoration may bleed, crop, or overlap as the direction asks, but never over readable text or controls.
The Landing first screen is an editorial spread, not a SaaS hero.
#F7F1E4 field. A thin mustard #C99A2E rule and a small-caps eyebrow — "AI ASSISTANT FOR SALES & OPS" — sit above an oversized Literata headline set flush-left across 9 columns: "Your CRM, read carefully." Beneath it, a 62ch sub-paragraph in Work Sans explains that crm-leads identifies duplicate contacts, categorizes incoming leads, summarizes customer interactions, and updates CRM records for sales and operations teams. The CTA is a rust #A64B2A underlined text link — no pill button, no gradient.The same signature moves carry into the working pages: summary cards styled as paper notes with a mustard left rule and a muted small-caps source line; duplicate detection shown as two overlapping record cards with matched fields highlighted in mustard and a hand-drawn bracket annotation; navigation as a narrow left rail of small-caps labels with a rust active marker.
Interaction Model: Animated Motion Tempo: restrained Hero Dimensionality: flat
Landing Hero Motion Brief

AI assistant for sales & ops
crm-leads is an AI assistant for sales and operations teams. It reads the contacts, leads, and interactions in your existing CRM, then identifies duplicate contacts, categorizes incoming leads, summarizes customer interactions, and updates CRM records — so your team spends less time on repetitive upkeep and more on the work that needs a person.
What the assistant handles
crm-leads works through the upkeep that slows sales and operations teams down. Each result is shown plainly, with its source in view, so you always know what was read and what was written.
The assistant reads contacts for overlapping details and surfaces likely duplicates side by side, with the fields that matched marked for review.
Incoming leads are categorized as they arrive, so each one sits with the group it belongs to and carries a marker showing the assistant made the call.
Customer interactions are summarized into plain, readable notes with the customer, the date and the interaction type kept beside them, each naming the source it was drawn from.
Accepted changes are written back to your existing CRM through its REST APIs, with the previous and updated values shown together so a person can confirm what changed.
crm-leads is for the company’s sales and operations teams — a colleague that reads the CRM carefully and writes things down plainly.

AI assistant for sales & ops
crm-leads is an AI assistant for sales and operations teams. It reads the contacts, leads, and interactions in your existing CRM, then identifies duplicate contacts, categorizes incoming leads, summarizes customer interactions, and updates CRM records — so your team spends less time on repetitive upkeep and more on the work that needs a person.
What the assistant handles
crm-leads works through the upkeep that slows sales and operations teams down. Each result is shown plainly, with its source in view, so you always know what was read and what was written.
The assistant reads contacts for overlapping details and surfaces likely duplicates side by side, with the fields that matched marked for review.
Incoming leads are categorized as they arrive, so each one sits with the group it belongs to and carries a marker showing the assistant made the call.
Customer interactions are summarized into plain, readable notes with the customer, the date and the interaction type kept beside them, each naming the source it was drawn from.
Accepted changes are written back to your existing CRM through its REST APIs, with the previous and updated values shown together so a person can confirm what changed.
crm-leads is for the company’s sales and operations teams — a colleague that reads the CRM carefully and writes things down plainly.
No comments yet. Be the first!