crm-lite
Skill121 starsChanged 5 months agoMITView on GitHub
Use when tracking customer interactions, managing leads, or building a lightweight CRM for small businesses without dedicated CRM software. Stores contacts, leads, activities, estimates, and communications in local SQLite.
In this repository15 other files it gives its agents.
- agent-cheatsheet-builderSkill
- construction-agentSkill
- estimator-engineSkill
- financial-analysisSkill
- grasshopper-voicemail-monitorSkill
- hermes-production-opsSkill
- lead-to-paymentSkill
- mailchimp-integrationSkill
- marketing-campaign-builderSkill
- outlook-graphSkill
- quickbooks-onlineSkill
- small-business-ai-transformationSkill
- small-business-website-specSkill
- stripe-link-cliSkill
- stripe-paymentsSkill
The file
Files
CRM-Lite — Lightweight SQLite CRM for Small Business
Overview
A minimal, file-based CRM built on SQLite for non-technical small business owners. No server, no external dependencies, no auth complexity. Designed for agent-mediated use: the owner interacts via text message with the agent, which reads/writes this database.
When to Use
- Small business (1-10 employees) with no existing CRM
- Agent-mediated access — owners interact via chat/Telegram, not direct DB access
- Lead tracking from website forms, referrals, email inquiries
- Pipeline visibility — estimate sent → accepted/rejected → job scheduled → paid
- Communication log — every email, call, text logged automatically
Don't Use For
- Multi-user concurrent access with role-based permissions
- Complex sales methodologies (MEDDIC, Challenger, etc.)
- Real-time collaboration features
- Integration with enterprise SSO/SCIM
Core Features
Data Model (SQLite: crm.db)
- customers — Core customer records
id(PK),name,email,phone,company,address,city,state,ziplead_source,lead_status(new/qualified/estimate_sent/won/lost)total_value,notes,created_at,updated_at
- leads — Inbound leads before qualification
id,source(website/referral/email/phone),contact_namecontact_email,contact_phone,company,property_addresssqft,ceiling_height,service_type,urgencystatus(new/qualified/estimate_ready/scheduled/lost)assigned_to,created_at,updated_at
- activities — Every touchpoint
id,customer_id(FK),lead_id(FK),activity_type(call/email/text/meeting/estimate_sent/estimate_accepted/estimate_rejected/job_scheduled/job_completed/invoice_sent/payment_received)description,outcome,next_action,next_action_datecreated_at,updated_at
- estimates — Estimate lifecycle
id,customer_id,lead_id,estimate_number,amountstatus(draft/sent/accepted/rejected/expired)sent_date,accepted_date,rejected_date,expires_dateline_items(JSON),notes,created_at,updated_at
- communications — Message log
id,customer_id,lead_id,direction(inbound/outbound)channel(email/sms/telegram/phone),subject,bodysent_at,created_at
- tasks — Action items for owners
id,customer_id,lead_id,title,descriptiondue_date,priority(low/medium/high/urgent),status(pending/in_progress/done)assigned_to,created_at,updated_at
Quick Start
import sqlite3
from pathlib import Path
DB_PATH = Path("~/.hermes/crm/crm.db").expanduser()
DB_PATH.parent.mkdir(parents=True, exist_ok=True)
def init_db():
conn = sqlite3.connect(DB_PATH)
conn.execute("""
CREATE TABLE IF NOT EXISTS customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, email TEXT, phone TEXT,
company TEXT, address TEXT, city TEXT, state TEXT, zip TEXT,
lead_source TEXT, lead_status TEXT DEFAULT 'new',
total_value REAL DEFAULT 0, notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
# ... other tables
conn.commit()
return connAgent Integration Patterns
Create Lead from Website Form
User: "New lead from website: John Smith, john@email.com, 555-555-0123, 123 Main St [CITY] [STATE] [ZIP], 2500 sqft, service request"
Agent: Creates lead record, sets status=qualified, creates task for the owner to reviewLog Estimate Sent
User: "Sent estimate #EST-0001-0042 to John Smith for $2,850"
Agent: Updates estimate status=sent, creates activity, creates task for follow-up in 3 daysWeekly Pipeline Report (Cron)
Agent: Queries all leads/customers, summarizes by stage, sends to the owner via TelegramCommon Pitfalls
- Forgetting to create indexes — Add indexes on
customers.email,leads.status,activities.customer_idfor query speed - Not backing up — SQLite file is the entire DB; copy to S3/Drive daily via cron
- Schema drift — Use migrations (numbered SQL files) rather than ad-hoc ALTER TABLE
- Concurrent writes — SQLite handles concurrent reads, but writes serialize; keep transactions short
Verification Checklist
crm.dbcreated with all 6 tables- Indexes on foreign keys and query columns
- Agent can: create lead, log activity, update estimate status, create task
- Weekly report cron outputs: new leads, estimates sent, conversion rate, pipeline value
- Backup script copies DB to offsite location daily
One-Shot Recipes
"New lead from referral"
conn = init_db()
lead_id = conn.execute("""
INSERT INTO leads (source, contact_name, contact_email, contact_phone, company, property_address, sqft, service_type, status)
VALUES ('referral', 'Jane Doe', 'jane@example.com', '555-555-0199', 'Example Realty', '456 Palm Ave [CITY] [STATE] [ZIP]', 3200, 'service_request', 'qualified')
""").lastrowid
conn.commit()"Get pipeline summary for weekly report"
summary = conn.execute("""
SELECT
COUNT(CASE WHEN lead_status='new' THEN 1 END) as new_leads,
COUNT(CASE WHEN lead_status='estimate_sent' THEN 1 END) as estimates_out,
COUNT(CASE WHEN lead_status='won' THEN 1 END) as won,
SUM(CASE WHEN lead_status='won' THEN total_value ELSE 0 END) as revenue
FROM customers
""").fetchone()Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

