<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kwasi Baidoo</title>
    <description>The latest articles on DEV Community by Kwasi Baidoo (@kwasii).</description>
    <link>https://dev.to/kwasii</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3969433%2F92a1c06e-4ff4-4947-af8b-cf57fe4653db.png</url>
      <title>DEV Community: Kwasi Baidoo</title>
      <link>https://dev.to/kwasii</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kwasii"/>
    <language>en</language>
    <item>
      <title>How to Generate Dummy Data for Excel Spreadsheets Using FakerForge (Free CSV Export)</title>
      <dc:creator>Kwasi Baidoo</dc:creator>
      <pubDate>Sun, 05 Jul 2026 19:16:00 +0000</pubDate>
      <link>https://dev.to/kwasii/how-to-generate-dummy-data-for-excel-spreadsheets-using-fakerforge-free-csv-export-a1j</link>
      <guid>https://dev.to/kwasii/how-to-generate-dummy-data-for-excel-spreadsheets-using-fakerforge-free-csv-export-a1j</guid>
      <description>&lt;p&gt;You've built a spreadsheet template. Maybe it's an inventory tracker, a customer list, or a sales report mockup. Now you need it to &lt;em&gt;look&lt;/em&gt; real — filled with realistic names, dates, prices, and IDs — so you can test formulas, build a demo, or show a client what the finished product will look like.&lt;/p&gt;

&lt;p&gt;The usual options aren't great:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Typing fake rows by hand (slow, repetitive, and always ends up looking like "John Doe" fifty times)&lt;/li&gt;
&lt;li&gt;Copying real customer data into a spreadsheet (a compliance headache, and overkill for a mockup)&lt;/li&gt;
&lt;li&gt;Using a generic "lorem ipsum" data generator that has no idea what an "order date" or "SKU" column is supposed to contain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://fakerforge.com" rel="noopener noreferrer"&gt;FakerForge&lt;/a&gt; solves this by letting you describe your columns in plain terms, generating realistic rows that actually match each column's purpose, and exporting the result as a CSV file you can open directly in Excel (or Google Sheets, Numbers, LibreOffice Calc — any tool that reads CSV).&lt;/p&gt;




&lt;h2&gt;
  
  
  Example Scenario: A Sample Product Inventory Sheet
&lt;/h2&gt;

&lt;p&gt;Let's say you're building an inventory tracking spreadsheet and you want it pre-filled with realistic sample data to test your formulas and pivot tables. Your sheet needs these columns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;product_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unique identifier for each product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;product_name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Name of the product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Product category (e.g., Electronics, Apparel, Home Goods)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unit_price&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Price per unit in USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;quantity_in_stock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of units currently in stock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;supplier_email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Contact email for the supplier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;date_added&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Date the product was added to inventory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Instead of typing 100 fake rows by hand, here's how to get this filled in with FakerForge in a few minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step-by-Step: From Column List to a Filled Excel Sheet
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Describe your columns as a schema
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://fakerforge.com/generate" rel="noopener noreferrer"&gt;fakerforge.com/generate&lt;/a&gt; and paste your column list in as a simple schema — you don't need real SQL syntax, a plain table definition works fine. For the inventory example, you could paste something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Table: products
- product_id (unique identifier)
- product_name (text)
- category (text)
- unit_price (decimal, USD)
- quantity_in_stock (integer)
- supplier_email (email)
- date_added (date)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FakerForge parses this into a table with recognized fields, ready for the next step.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Let FakerForge detect and map each column
&lt;/h3&gt;

&lt;p&gt;Once your schema is parsed, FakerForge assigns a faker mapping to each column based on its name and type — an &lt;code&gt;email&lt;/code&gt;-style column gets realistic email formats, a &lt;code&gt;date&lt;/code&gt; column gets valid dates, and so on. You can review and adjust these mappings before generating anything, so a column like &lt;code&gt;category&lt;/code&gt; can be constrained to a specific set of values (Electronics, Apparel, Home Goods) instead of random text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Set your row count
&lt;/h3&gt;

&lt;p&gt;Decide how many sample rows you want — 20 rows to sanity-check your formulas, or a few hundred to properly stress-test a pivot table. On the free plan you can generate up to 100 rows per table, which is plenty for most spreadsheet mockups and demos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Generate
&lt;/h3&gt;

&lt;p&gt;Run the generation step. FakerForge streams the rows in and shows you a live preview, so you can catch anything that looks off before exporting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Export as CSV and open in Excel
&lt;/h3&gt;

&lt;p&gt;Once you're happy with the preview, export your table as CSV. Open the downloaded file directly in Excel — File → Open, or just double-click it — and you'll have a fully populated sheet with realistic product IDs, names, categories, prices, stock counts, supplier emails, and dates, all ready for your formulas, charts, and pivot tables.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Beats Manually Typing Sample Data
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It's actually realistic.&lt;/strong&gt; A &lt;code&gt;supplier_email&lt;/code&gt; column gets real-looking email addresses, not "&lt;a href="mailto:test1@test.com"&gt;test1@test.com&lt;/a&gt;" repeated 100 times. A &lt;code&gt;unit_price&lt;/code&gt; column gets sensible decimal values instead of round numbers that don't stress-test your rounding formulas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It respects your column names.&lt;/strong&gt; FakerForge reads what each column is called and generates data that fits — dates in date columns, numbers in numeric columns, categories that make sense for a &lt;code&gt;category&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It scales instantly.&lt;/strong&gt; Need 20 rows for a quick check and then 500 rows for a bigger demo? Just change the row count and regenerate — no retyping.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No real data involved.&lt;/strong&gt; Every value is synthetic, so there's no risk of accidentally putting a real customer's name, email, or price data into a spreadsheet you're going to share around the office or with a client.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beyond a Single Sheet
&lt;/h2&gt;

&lt;p&gt;If your spreadsheet needs multiple related tabs — say, a &lt;code&gt;products&lt;/code&gt; sheet and an &lt;code&gt;orders&lt;/code&gt; sheet where each order references a real product ID — FakerForge's relationship-aware generation handles that too. Parent tables (like &lt;code&gt;products&lt;/code&gt;) generate first, and child tables (like &lt;code&gt;orders&lt;/code&gt;) reference valid parent rows, so you don't end up with an order pointing to a product that doesn't exist.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;You can try this entire workflow on FakerForge's free tier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 rows per table&lt;/li&gt;
&lt;li&gt;10 tables per database&lt;/li&gt;
&lt;li&gt;CSV, JSON, or SQL export&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's enough to fill out a realistic sample spreadsheet in a few minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fakerforge.com/generate" rel="noopener noreferrer"&gt;Generate your first dummy dataset for Excel →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>xlsx</category>
      <category>csv</category>
      <category>data</category>
    </item>
    <item>
      <title>Generate Realistic Dummy Data for CRM Testing (Salesforce, HubSpot &amp; Custom CRMs) with FakerForge</title>
      <dc:creator>Kwasi Baidoo</dc:creator>
      <pubDate>Sat, 04 Jul 2026 15:00:33 +0000</pubDate>
      <link>https://dev.to/kwasii/generate-realistic-dummy-data-for-crm-testing-salesforce-hubspot-custom-crms-with-fakerforge-2p2o</link>
      <guid>https://dev.to/kwasii/generate-realistic-dummy-data-for-crm-testing-salesforce-hubspot-custom-crms-with-fakerforge-2p2o</guid>
      <description>&lt;p&gt;If you've ever tested a CRM integration, built a custom CRM, or set up a demo environment for a sales team, you've probably run into the same problem: you need contacts, companies, and deals in the system, but you don't want to use real customer data to get there.&lt;/p&gt;

&lt;p&gt;This shows up constantly across popular CRM tools and custom-built systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Salesforce&lt;/strong&gt; developers testing a new Apex trigger or Flow against sandbox records&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HubSpot&lt;/strong&gt; teams building a new pipeline stage or workflow automation before rolling it out&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zoho CRM&lt;/strong&gt; or &lt;strong&gt;Pipedrive&lt;/strong&gt; admins configuring custom fields and needing sample records to validate them&lt;/li&gt;
&lt;li&gt;In-house/custom CRMs built on Laravel, Django, Rails, or similar frameworks, where the database needs seeding before QA can even start&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copying real contacts and deals into a sandbox or staging CRM to test with isn't just risky — it's also usually against the CRM vendor's own data-handling terms, and it puts real customer PII somewhere it doesn't need to be. &lt;a href="https://fakerforge.com" rel="noopener noreferrer"&gt;FakerForge&lt;/a&gt; gives you a faster, safer alternative: describe your CRM's data structure once, and generate as many realistic, relationship-aware test records as you need.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a CRM Test Dataset Actually Needs
&lt;/h2&gt;

&lt;p&gt;Most CRMs — whether it's Salesforce, HubSpot, or something you built yourself — are built around a similar core structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contacts&lt;/strong&gt; — names, emails, phone numbers, job titles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companies/Accounts&lt;/strong&gt; — company names, industries, sizes, websites&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deals/Opportunities&lt;/strong&gt; — deal names, stages, values, close dates, and a reference back to the contact and company they belong to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activities&lt;/strong&gt; — notes, tasks, or call logs tied to a contact or deal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tricky part isn't generating fake names and emails — plenty of tools can do that. The hard part is making sure every deal correctly points to a real contact and company in the same dataset, and every activity points to a real deal. That's where most quick "fake data" scripts fall apart, and it's exactly what FakerForge is built to handle.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Generate CRM Test Data with FakerForge
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Define your CRM's tables
&lt;/h3&gt;

&lt;p&gt;On &lt;a href="https://fakerforge.com/generate" rel="noopener noreferrer"&gt;fakerforge.com/generate&lt;/a&gt;, paste in a schema describing your CRM's core objects. If you're testing a custom CRM, you likely already have this as a database schema or migration file — just paste it in directly. If you're testing against Salesforce, HubSpot, or another SaaS CRM, describe the objects and fields you're working with in the same format, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Table: companies
- id (unique identifier)
- name (company name)
- industry (text)
- website (url)

Table: contacts
- id (unique identifier)
- company_id (references companies.id)
- full_name (text)
- email (email)
- job_title (text)
- phone (phone number)

Table: deals
- id (unique identifier)
- contact_id (references contacts.id)
- company_id (references companies.id)
- deal_name (text)
- stage (text: Prospecting, Qualified, Proposal, Closed Won, Closed Lost)
- value (decimal, USD)
- close_date (date)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FakerForge parses this into tables, detects the foreign keys (&lt;code&gt;company_id&lt;/code&gt;, &lt;code&gt;contact_id&lt;/code&gt;), and understands that &lt;code&gt;contacts&lt;/code&gt; and &lt;code&gt;deals&lt;/code&gt; depend on &lt;code&gt;companies&lt;/code&gt; existing first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Review the generated field mappings
&lt;/h3&gt;

&lt;p&gt;Each column gets mapped to a realistic faker method automatically — &lt;code&gt;email&lt;/code&gt; fields get valid email formats, &lt;code&gt;phone&lt;/code&gt; fields get properly formatted numbers, &lt;code&gt;deal_name&lt;/code&gt; fields get plausible-sounding deal titles. You can adjust any mapping before generating, which is useful for a field like &lt;code&gt;stage&lt;/code&gt;, where you'll want to constrain values to your actual pipeline stages rather than random text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Set row counts per object
&lt;/h3&gt;

&lt;p&gt;Decide how many companies, contacts, and deals you need. A common pattern for CRM testing is a smaller number of companies with several contacts and deals attached to each — for example, 20 companies, 60 contacts, and 100 deals — so your pipeline views and reports have enough volume to look realistic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Generate with relationships intact
&lt;/h3&gt;

&lt;p&gt;Run the generation step. Parent tables generate first — companies, then contacts, then deals — so every contact has a valid &lt;code&gt;company_id&lt;/code&gt;, and every deal has a valid &lt;code&gt;contact_id&lt;/code&gt; and &lt;code&gt;company_id&lt;/code&gt;. No orphaned deals pointing to companies that don't exist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Export and import into your CRM
&lt;/h3&gt;

&lt;p&gt;Export the result as CSV, JSON, or SQL depending on how your CRM accepts data:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSV&lt;/strong&gt; works well for Salesforce Data Import Wizard, HubSpot's contact/company import tools, or Zoho's import feature&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON&lt;/strong&gt; is useful if you're testing against a CRM's REST API directly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQL&lt;/strong&gt; is the right choice if you're seeding a custom CRM's own database&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why This Beats Hand-Building CRM Test Data
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Referential integrity, automatically.&lt;/strong&gt; Every deal references a real contact and company in the same dataset — no broken lookups when you open a deal record and the associated contact is missing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Volume without the tedium.&lt;/strong&gt; Populating a sandbox with 100 believable deals across 20 companies by hand would take hours. Generating it takes minutes, and you can regenerate a fresh batch any time your schema changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No real customer data anywhere near your sandbox.&lt;/strong&gt; Every name, email, and phone number is synthetic, so there's no compliance concern about putting real contact records into a test or demo CRM instance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Works whether you're testing a SaaS CRM or building your own.&lt;/strong&gt; The same schema-first workflow applies whether you're prepping records for a Salesforce sandbox import or seeding the database behind a CRM you're building from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;FakerForge's free tier covers a solid CRM test dataset out of the box:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 rows per table&lt;/li&gt;
&lt;li&gt;10 tables per database&lt;/li&gt;
&lt;li&gt;Export as SQL, JSON, or CSV&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's enough to seed companies, contacts, deals, and activity logs for a realistic CRM test run.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fakerforge.com/generate" rel="noopener noreferrer"&gt;Generate your CRM test dataset →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>data</category>
      <category>crm</category>
    </item>
    <item>
      <title>Building a Self-Hosted Photo Organizer with Face Recognition (Laravel + FastAPI + InsightFace)</title>
      <dc:creator>Kwasi Baidoo</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:05:38 +0000</pubDate>
      <link>https://dev.to/kwasii/building-a-self-hosted-photo-organizer-with-face-recognition-laravel-fastapi-insightface-3g2k</link>
      <guid>https://dev.to/kwasii/building-a-self-hosted-photo-organizer-with-face-recognition-laravel-fastapi-insightface-3g2k</guid>
      <description>&lt;p&gt;I take a lot of photos. Like most people, I'd been dumping them into Google Photos for years, mostly for the face-grouping feature — that quiet magic where it just knows which photos have your kid, your friend, your dog in them. Then I started wondering: could I build that myself, on my own hardware, without shipping every photo of my family to a cloud provider?&lt;/p&gt;

&lt;p&gt;Turns out, yes — and it became one of the more satisfying infrastructure projects I've built in a while.&lt;/p&gt;

&lt;p&gt;This post walks through the architecture, the interesting technical decisions, and a few of the harder problems I ran into along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;At a high level: you upload photos, the system detects faces in them, groups similar faces into "people," and gives you a dashboard to browse, tag, and correct those groupings — all running locally via Docker, no external API calls, no subscription.&lt;/p&gt;

&lt;p&gt;Three repositories make up the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;face-pipeline&lt;/strong&gt; — a FastAPI service that does the actual computer vision work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;face-pipeline-ui&lt;/strong&gt; — a Laravel application that provides the dashboard, uploads, and real-time progress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;photo-organizer&lt;/strong&gt; — the deployment layer, tying everything together with Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The face recognition pipeline
&lt;/h2&gt;

&lt;p&gt;The core of the project is InsightFace, using two of its models in sequence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SCRFD&lt;/strong&gt; for face detection — finding the bounding boxes of faces in a photo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ArcFace&lt;/strong&gt; for generating embeddings — turning each detected face into a vector that captures its distinguishing features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have embeddings, the interesting problem becomes: how do you group them into "people" without knowing in advance how many people exist, or manually labeling anything?&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;HDBSCAN&lt;/strong&gt;, a density-based clustering algorithm that doesn't require you to specify the number of clusters upfront — a good fit here since you have no idea how many distinct people are in a given photo library. Face embeddings get stored in &lt;strong&gt;pgvector&lt;/strong&gt; (a Postgres extension for vector similarity search), which makes it fast to compare new faces against existing clusters.&lt;/p&gt;

&lt;p&gt;That last point matters more than it sounds. Naively, you'd want to re-cluster the &lt;em&gt;entire&lt;/em&gt; dataset every time a new photo comes in — expensive, and it gets worse as your library grows. Instead, the pipeline does &lt;strong&gt;incremental centroid matching&lt;/strong&gt;: each existing cluster has a centroid (essentially, its "average face"), and new detections get compared against those centroids first. Only when something doesn't confidently match an existing cluster does it get treated as a new person or an ambiguous case for review. This keeps ongoing processing fast even as the library scales.&lt;/p&gt;

&lt;p&gt;To keep cluster quality high, two filters run before anything reaches the clustering stage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blur scoring&lt;/strong&gt;, using variance-of-Laplacian, to filter out faces too blurry to be useful&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Relative face-size filtering&lt;/strong&gt;, to discard faces that are too small in the frame to produce a reliable embedding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Garbage in, garbage out applies especially hard to face clustering — a handful of bad embeddings can pull a whole cluster in the wrong direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The application layer
&lt;/h2&gt;

&lt;p&gt;The FastAPI service is deliberately narrow — it does computer vision and nothing else. Everything user-facing lives in a Laravel app: project management, photo uploads, browsing detected people, correcting misclassifications, and a real-time dashboard showing pipeline progress.&lt;/p&gt;

&lt;p&gt;That real-time piece uses &lt;strong&gt;Laravel Reverb&lt;/strong&gt;, Laravel's self-hosted WebSocket server. When you upload a batch of photos, they get processed asynchronously through the pipeline, and the UI updates live as each stage completes — detection, embedding, clustering — rather than making you refresh or poll.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two deployment modes
&lt;/h2&gt;

&lt;p&gt;One thing I wanted from the start: this shouldn't be an "advanced users only" project. So &lt;code&gt;photo-organizer&lt;/code&gt; ships two ways to run it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single-container mode&lt;/strong&gt; — everything (web server, queue workers, scheduler, websocket server) runs in one container. Simplest possible setup: clone, &lt;code&gt;docker compose up&lt;/code&gt;, done. Good for trying it out or running it on modest hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-container mode&lt;/strong&gt; — the same Laravel app split across independent containers for the web server, Horizon (queue workers), the scheduler, and Reverb, each able to scale independently. If you're processing a large photo library and want to throw more workers at the queue without touching anything else, this is the mode for that.&lt;/p&gt;

&lt;p&gt;Splitting a working single-container setup into multiple containers turned out to be its own small adventure — Docker networking has opinions about what &lt;code&gt;localhost&lt;/code&gt; means that don't survive the transition, and I hit a genuinely subtle bug where WebSocket broadcasts silently failed once the app was split, because the same environment variable was quietly doing two incompatible jobs (telling the browser where to connect, and telling the backend where to publish). That's a story for its own post, but the short version is: if you're planning to split a monolithic Docker container into services, audit every environment variable for hidden dual purposes before you do.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;A few honest reflections, since a lot of the value in writing these things up is being straight about the rough edges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cluster tuning takes patience.&lt;/strong&gt; HDBSCAN's &lt;code&gt;min_cluster_size&lt;/code&gt; and &lt;code&gt;min_samples&lt;/code&gt; parameters meaningfully change how aggressively faces get grouped, and the right values depend on your specific photo library — how many photos per person, how much lighting/angle variation, etc. I exposed these as configurable environment variables rather than hardcoding a "correct" value, because there isn't one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared storage between services needs care.&lt;/strong&gt; The FastAPI pipeline and the Laravel app both need access to the same photo/face-crop files, which means getting file permissions right across containers running as different users — a small thing that cost more debugging time than the computer vision code did.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental matching is worth the complexity.&lt;/strong&gt; I almost skipped it in favor of simpler full re-clustering, and I'm glad I didn't — the difference in how the system feels as your library grows is significant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Everything is open source (Apache-2.0):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/kwasii1/photo-organizer" rel="noopener noreferrer"&gt;photo-organizer&lt;/a&gt; — start here for deployment&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kwasii1/face-pipeline" rel="noopener noreferrer"&gt;face-pipeline&lt;/a&gt; — the FastAPI/InsightFace service&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kwasii1/face-pipeline-ui" rel="noopener noreferrer"&gt;face-pipeline-ui&lt;/a&gt; — the Laravel dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're into self-hosting, computer vision, or just enjoy a good Docker Compose stack, I'd love feedback — issues, PRs, or just thoughts on the architecture are all welcome.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>laravel</category>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>AI-Assisted Data Generation: Use Claude or Your AI Agent to Generate Mock Data</title>
      <dc:creator>Kwasi Baidoo</dc:creator>
      <pubDate>Fri, 05 Jun 2026 08:19:03 +0000</pubDate>
      <link>https://dev.to/kwasii/ai-assisted-data-generation-use-claude-or-your-ai-agent-to-generate-mock-data-1dl6</link>
      <guid>https://dev.to/kwasii/ai-assisted-data-generation-use-claude-or-your-ai-agent-to-generate-mock-data-1dl6</guid>
      <description>&lt;p&gt;Imagine asking your AI assistant to generate a complete test database and having it happen instantly without switching tools.&lt;/p&gt;

&lt;p&gt;"Generate test data for a users table with 1,000 rows, a posts table with 5,000 rows, and ensure every post references a valid user."&lt;/p&gt;

&lt;p&gt;The AI handles it. You get back SQL you can import directly.&lt;/p&gt;

&lt;p&gt;This is now possible with FakerForge's MCP integration.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is MCP?
&lt;/h2&gt;

&lt;p&gt;MCP (Model Context Protocol) is a standard for connecting AI agents to external tools and services. Tools like Claude, Cursor, and other MCP-capable clients can invoke these external services directly.&lt;/p&gt;

&lt;p&gt;FakerForge exposes an MCP server. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your AI agent (Claude, Cursor, etc.) can call FakerForge functions&lt;/li&gt;
&lt;li&gt;You can ask the agent to generate data in natural language&lt;/li&gt;
&lt;li&gt;The agent connects to FakerForge, runs generation, and returns results&lt;/li&gt;
&lt;li&gt;All without leaving your editor&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Setting Up MCP With FakerForge
&lt;/h2&gt;

&lt;p&gt;According to FakerForge's MCP documentation, the setup process is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create an MCP Token&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to FakerForge's MCP token page and create a token. According to the docs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Copy it immediately. Store securely in your client config."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This token authenticates your AI agent with FakerForge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Configure Your MCP Client&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add FakerForge to your MCP client config (VS Code, Cursor, Claude Code, or Windsurf):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fakerforge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://your-domain/mcp/fakerforge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_TOKEN"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Verify Connectivity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The docs recommend testing with read-only tools first:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"First MCP calls: list-schemas, get-codebase-schema, list-mocks. These verify auth and connectivity before mutation tools."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once you can list schemas, you're connected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Workflow: Generating Data With Claude
&lt;/h2&gt;

&lt;p&gt;Now you can ask Claude to generate data directly from your editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 1: Simple Data Generation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"I have a users table with id, email, name, and country. 
Generate 100 rows of realistic test data as SQL."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude calls FakerForge's MCP tools to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parse your schema&lt;/li&gt;
&lt;li&gt;Generate 100 rows&lt;/li&gt;
&lt;li&gt;Return SQL&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You get back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'john.smith@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'John Smith'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'US'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'maria.rodriguez@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Maria Rodriguez'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'MX'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example 2: Multiple Tables With Relationships
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"Generate test data for a blog platform:
- users table: 50 rows
- posts table: 200 rows (each post references a valid user)
- comments table: 500 rows (each comment references a valid post)
Make sure all foreign keys are valid."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Parses your schema (detects the relationships)&lt;/li&gt;
&lt;li&gt;Calls FakerForge's generation with row counts&lt;/li&gt;
&lt;li&gt;FakerForge handles relationship-aware generation&lt;/li&gt;
&lt;li&gt;Returns SQL with valid FK references&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You get consistent, valid data without writing anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 3: List Existing Schemas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: "What schemas do I have in FakerForge?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude calls &lt;code&gt;list-schemas&lt;/code&gt; and returns your existing schemas, letting you reuse them rather than recreating.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Context Stays in Your Editor
&lt;/h3&gt;

&lt;p&gt;Before MCP, generating data required:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to fakerforge.com&lt;/li&gt;
&lt;li&gt;Paste schema&lt;/li&gt;
&lt;li&gt;Set row counts&lt;/li&gt;
&lt;li&gt;Download&lt;/li&gt;
&lt;li&gt;Come back to editor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now: Ask Claude in your editor. Get SQL back. Paste.&lt;/p&gt;

&lt;h3&gt;
  
  
  Natural Language Interface
&lt;/h3&gt;

&lt;p&gt;Instead of learning FakerForge's UI, you describe what you want in English. Claude translates to the right FakerForge operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration With Your Workflow
&lt;/h3&gt;

&lt;p&gt;You're already using Claude/Cursor for coding. MCP makes data generation part of that same conversation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;You&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"Here's my schema (paste). Generate 1,000 rows of realistic test data."&lt;/span&gt;

&lt;span class="n"&gt;Claude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"I'll generate that for you."&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Calls&lt;/span&gt; &lt;span class="n"&gt;FakerForge&lt;/span&gt; &lt;span class="n"&gt;MCP&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nv"&gt;"Here's your data: [SQL]"&lt;/span&gt;

&lt;span class="n"&gt;You&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"Perfect, paste it into seed.sql for me"&lt;/span&gt;

&lt;span class="n"&gt;Claude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"Done. Want me to run the import?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AI Agents Can Drive Automation
&lt;/h3&gt;

&lt;p&gt;A CI/CD agent or code migration tool can call FakerForge directly via MCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# CI/CD pipeline calls Claude agent
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generate test data for schema.sql with 10,000 rows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Claude uses FakerForge MCP tools
# Generates data
# CI/CD gets SQL back
# Imports into test database
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Security Guidelines
&lt;/h2&gt;

&lt;p&gt;FakerForge's docs emphasize security for MCP:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Never commit MCP tokens. Rotate tokens on team/member changes. Use least privilege and environment separation."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Best practices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Store tokens securely&lt;/strong&gt; — use environment variables or secure credential managers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate on team changes&lt;/strong&gt; — when someone leaves, revoke their token&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One token per integration&lt;/strong&gt; — don't share a single token across multiple systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Least privilege&lt;/strong&gt; — create tokens with only the permissions needed&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Practical Example: Setting Up in Cursor
&lt;/h2&gt;

&lt;p&gt;Cursor is VS Code with integrated AI. Here's how to add FakerForge MCP:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Create your FakerForge MCP token&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Open &lt;code&gt;.cursor/mcp.json&lt;/code&gt; in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fakerforge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.fakerforge.com/mcp/fakerforge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer sk-ff_your_token_here"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; In Cursor chat, ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt; &lt;span class="k"&gt;database&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; 
&lt;span class="n"&gt;Here&lt;/span&gt;&lt;span class="s1"&gt;'s my schema (paste schema).
Generate 5,000 rows and return as SQL.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Cursor calls FakerForge MCP tools, Claude generates data&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Copy the SQL into your seed file&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;




&lt;h2&gt;
  
  
  What MCP Tools Are Available?
&lt;/h2&gt;

&lt;p&gt;According to the docs, FakerForge exposes tools for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;list-schemas&lt;/strong&gt; — list all your schemas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;get-codebase-schema&lt;/strong&gt; — retrieve a specific schema&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;list-mocks&lt;/strong&gt; — list your mock APIs&lt;/li&gt;
&lt;li&gt;Plus mutation tools for generation and mocking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The docs recommend starting with read-only tools (list, get) to verify connectivity, then moving to mutation tools (generate, create).&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CI/CD Pipeline Automation
&lt;/h3&gt;

&lt;p&gt;Your CI/CD pipeline needs fresh test data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate test data via MCP&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;claude --mcp fakerforge generate \&lt;/span&gt;
      &lt;span class="s"&gt;--schema schema.sql \&lt;/span&gt;
      &lt;span class="s"&gt;--customers 100000 \&lt;/span&gt;
      &lt;span class="s"&gt;--invoices 500000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Schema Evolution
&lt;/h3&gt;

&lt;p&gt;You modify your schema. Claude automatically regenerates your seed data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"I added a 'phone_number' column to users. 
Update my test data to include it."&lt;/span&gt;

&lt;span class="n"&gt;Claude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Detects&lt;/span&gt; &lt;span class="k"&gt;schema&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regenerates&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Demo Data
&lt;/h3&gt;

&lt;p&gt;Spinning up a demo environment for a customer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"Generate a realistic demo database 
with 100 customers, 1,000 orders, all relationships valid."&lt;/span&gt;

&lt;span class="n"&gt;Claude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Generates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;returns&lt;/span&gt; &lt;span class="k"&gt;SQL&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Docs Say This Is the Future
&lt;/h2&gt;

&lt;p&gt;FakerForge's MCP documentation positions it clearly: AI agents should be able to generate data as easily as developers can today.&lt;/p&gt;

&lt;p&gt;The current workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;UI-based (go to website, use UI)&lt;/li&gt;
&lt;li&gt;Manual (you decide parameters)&lt;/li&gt;
&lt;li&gt;Slow (multiple steps)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MCP-enabled workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chat-based (ask in natural language)&lt;/li&gt;
&lt;li&gt;Automated (AI decides parameters based on intent)&lt;/li&gt;
&lt;li&gt;Fast (one-step)&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;If you're already using Claude, Cursor, or similar tools, adding FakerForge's MCP integration is a no-brainer.&lt;/p&gt;

&lt;p&gt;Generate test data without leaving your editor. Ask in natural language. Get SQL back. Done.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://fakerforge.com/docs/mcp-quickstart" rel="noopener noreferrer"&gt;Get your MCP token&lt;/a&gt; and add it to your editor config.&lt;/p&gt;

&lt;p&gt;Your data generation workflow just got 10x faster.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>data</category>
      <category>tooling</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
