How to Build a Contact Database with DenchClaw
Build a structured contact database in DenchClaw with custom fields, smart views, and AI-powered enrichment—all stored locally in DuckDB on your machine.
A contact database is only as useful as the structure behind it. Flat spreadsheets break down once you pass a few hundred contacts. Cloud CRMs charge per seat and lock your data behind proprietary APIs. DenchClaw gives you a proper relational contact database that runs locally, queries in milliseconds, and lets an AI agent help you maintain it.
Here's how to build one from scratch.
Step 1: Plan Your Contact Schema#
Before creating anything, spend five minutes thinking about what you actually need to track. The most common mistake is over-engineering the schema upfront. Start minimal—you can always add fields later.
A solid starting schema for most use cases:
| Field | Type | Notes |
|---|---|---|
| Full Name | text | Primary identifier |
| Email Address | Unique, used for dedup | |
| Phone | phone | Optional |
| Company | relation | Links to companies object |
| Title | text | Job title |
| LinkedIn URL | url | For enrichment |
| Status | enum | Lead, Contact, Customer, Churned |
| Source | enum | LinkedIn, Referral, Inbound, Event, Cold |
| Tags | tags | Flexible categorization |
| Last Contacted | date | For follow-up tracking |
| Notes | richtext | Free-form notes |
Ask DenchClaw to create this: "Create a people object with these fields: [paste the list]. Set default view to table, kanban field to Status."
Step 2: Create the Companies Object First#
If you're tracking business contacts, create a companies object before your people object. This lets you use a relation field to link each contact to their company—like a proper relational database.
"Create a companies object with fields: Company Name (text), Website (url),
Industry (enum), Size (enum: 1-10, 11-50, 51-200, 201-1000, 1000+),
Location (text), LinkedIn URL (url), Notes (richtext)."
When you create the people object, add a Company field of type relation pointing to the companies object. DenchClaw handles the foreign key relationship in DuckDB automatically.
This pays off later when you want to answer questions like "show me all contacts at Series B SaaS companies"—the agent can join across the relation.
Step 3: Import Your Existing Contacts#
You probably have contacts scattered across spreadsheets, Gmail, LinkedIn, and previous CRMs. DenchClaw can pull from all of them.
From CSV/spreadsheet: Export your contacts as CSV and ask DenchClaw to import it:
"Import contacts from ~/Downloads/contacts.csv into my people object.
The columns are: Name, Email, Company, Title. Map them to Full Name,
Email Address, Company (as a new company entry if it doesn't exist), Title."
The agent handles column mapping, deduplication against existing entries, and creates new company entries automatically.
From Gmail:
"Import all contacts from my Gmail that I've emailed in the last 6 months
who aren't already in my people object."
The gog skill pulls your Google Contacts and recent email correspondents, deduplicates, and adds them.
From LinkedIn: The browser agent can navigate LinkedIn as you (using your existing Chrome session) and import contacts from your connections or from a search. This is particularly useful for targeted prospecting.
From a previous CRM: If you're migrating from HubSpot, Salesforce, Pipedrive, or Airtable, DenchClaw's browser agent can export the data from those platforms and import it. Just ask—the agent knows how to navigate these tools because it uses your existing logged-in browser session.
Step 4: Set Up Deduplication#
Duplicate contacts are the #1 problem in every contact database. Set up a deduplication workflow early.
Ask DenchClaw:
"Check my people object for duplicate contacts. Look for matching email
addresses first, then similar names at the same company. Show me the
duplicates and let me decide which to merge."
The agent will run a SQL query against your DuckDB:
SELECT email_address, COUNT(*) as count
FROM v_people
WHERE email_address IS NOT NULL
GROUP BY email_address
HAVING count > 1For each duplicate pair, it surfaces them in a comparison view and lets you choose which record to keep, then merges the data.
Set a reminder to run deduplication monthly: "Remind me to run contact deduplication on the first Monday of every month."
Step 5: Enrich Your Contacts#
Raw contact data is useful. Enriched contact data is powerful. DenchClaw can auto-enrich contacts with additional information from the web.
Via Apollo.io browser automation:
"For all contacts in my people object where Company is empty or Title is empty,
look them up on Apollo.io and fill in the missing fields."
Via LinkedIn browser automation:
"For the 20 newest contacts in my people object, visit their LinkedIn profiles
and update their Title, Company, and Location fields."
Via company website:
"For contacts where we have a company URL but no Industry or Size,
visit each company's About page and infer the Industry and Size fields."
These enrichment tasks run in the background. The browser agent navigates each URL, extracts the relevant data, and writes it back to DuckDB—without you doing anything manually.
Step 6: Create Smart Views#
A database without views is a pile of data. Create saved views for the segments you actually work with:
Leads to follow up with:
"Create a view called 'Follow Up Queue' in my people object: Status = Lead,
Last Contacted is more than 14 days ago or null, sorted by Last Contacted ascending."
Recent additions:
"Create a view called 'New This Week' showing contacts created in the last 7 days."
By source:
"Create a view called 'LinkedIn Contacts' filtering where Source = LinkedIn."
High-value contacts:
"Create a view called 'Enterprise Contacts' where Company Size is 201-1000 or 1000+."
These views persist in your .object.yaml and appear in the sidebar dropdown. You can switch between them in one click.
Step 7: Tag and Categorize#
The tags field is your most flexible tool for categorization. Unlike enums, tags are multi-value—a contact can have tags like investor, advisor, warm-intro, and conference-2026 simultaneously.
Use tags for:
- Event attendance (YC Demo Day 2026, SaaStr 2026)
- Relationship quality (warm, cold, intro-pending)
- Interest areas (AI, developer-tools, enterprise)
- Action states (needs-intro, do-not-contact, follow-up-Q3)
Ask the agent to apply tags in bulk: "Tag all contacts at YC companies with 'yc-portfolio'."
Step 8: Set Up Activity Tracking#
The Last Contacted date is only useful if you keep it updated. Create a lightweight activity log alongside your contacts.
Ask DenchClaw to create an activities object:
"Create an activities object with fields: Contact (relation to people),
Type (enum: Email, Call, Meeting, LinkedIn DM, Other), Date (date),
Notes (text). Link it to my people object."
When you have a call or meeting, log it: "Log a call with Sarah Chen today, we discussed their Q3 budget cycle."
The agent creates the activity entry, updates Sarah's Last Contacted date, and adds the note to her entry document.
Step 9: Build a Contact Health Dashboard#
Once you have a few hundred contacts, you want visibility into the database as a whole. Ask DenchClaw to build a dashboard:
"Build a dashboard app showing: total contacts by status (pie chart),
new contacts per week over the last 3 months (line chart),
contacts by source (bar chart), and contacts not contacted in 30+ days (count card)."
This creates a .dench.app in your workspace that queries your live DuckDB data and renders in an interactive UI. It updates in real time as your contact data changes.
Step 10: Maintain Data Quality#
A contact database decays over time. People change jobs, emails bounce, companies get acquired. Schedule regular maintenance:
Monthly: Run deduplication, identify contacts with missing key fields, mark obviously stale records.
Quarterly: Bulk re-enrich contacts added more than 6 months ago—job titles and companies change frequently.
Annually: Archive contacts with no interaction in 12+ months. Don't delete—move them to an "Archived" status.
Ask DenchClaw to create a data quality report: "Show me how many contacts are missing email, how many haven't been contacted in 90 days, and how many have no company linked."
Frequently Asked Questions#
How many contacts can DenchClaw handle?#
DuckDB handles millions of rows efficiently. For typical contact databases (under 100,000 contacts), queries run in single-digit milliseconds. Performance is not a concern until you're well into the hundreds of thousands.
Can multiple people share a contact database?#
DenchClaw is primarily single-user (local-first). For team sharing, Dench Cloud sync is coming. In the meantime, you can share via a network-mounted DuckDB file or by syncing the workspace via Git.
Can I export my contacts?#
At any time. DuckDB can export to CSV, JSON, or Parquet. Ask: "Export all my contacts to a CSV file" and the agent will write it to your Downloads folder.
Does it sync with my phone's contacts?#
Not automatically yet, but you can export to vCard format. Native mobile sync is on the roadmap.
How is this different from keeping contacts in a spreadsheet?#
Relational links (contacts linked to companies), custom views and filters, AI-powered enrichment, full-text search across all fields, action fields that trigger automation, and a sub-millisecond query engine. Spreadsheets break down past a few hundred rows and have no automation layer.
Ready to try DenchClaw? Install in one command: npx denchclaw. Full setup guide →
