TL;DR. Loom Genie is the online store of a family that has cleaned, restored and sold rugs in the United States since 1972. The vendor catalog only existed as PDF: a price sheet and a 773-page catalog. Instead of entering products one by one, we wrote scripts that read those PDFs by page coordinates and build the catalog on their own. The result: 75 collections and 789 products with photos, filters by size, room, color and material, Stripe checkout and an admin panel the family runs themselves.
Who Loom Genie is
Loom Genie is the digital storefront of Aref's Rugs, a family business in Bel Air, Maryland, serving customers since 1972. That is more than 50 years of cleaning, restoring and selling rugs. The client came to us through a referral with one clear goal: sell online without losing the feel of a family shop.
The online store has a sharp focus: rugs for pet owners. Dense, low-pile synthetic fiber, stain resistant and easy to clean with soap and water. It is a niche with a concrete pain, and the whole store is designed around it, from the homepage to the filters.
The problem: the catalog existed, but on paper
The vendor delivered everything in two files: a price sheet and a 773-page catalog with collections, colors, sizes and photos. For a physical store that works, a salesperson flips through it and answers the customer. For an e-commerce store, it is the worst possible format.
Entering everything by hand was off the table. We are talking about hundreds of products, each with several size and price combinations. Manual typing at that volume produces exactly the kind of error that hurts an online store: the price of the 8x10 showing up on the 5x8, a photo filed under the wrong collection. And the error only surfaces when a customer complains.
How we solved it: reading the PDF by coordinates
The fix was to treat the PDF as data, not as a document. We wrote scripts that open the price sheet and the catalog and extract, product by product, price, collection, size, color and photo.
The detail that made the difference: extraction uses the coordinates of each element on the page, not the running text. When you pull only the text out of a PDF table, the columns get shuffled and a price slips into the row below without anyone noticing. By looking at each block's position, the script knows that price sits at the same height as that size, so the row stays whole.
With that, the entire catalog was built with zero typing: 75 sellable collections and 789 products with photos. Human work became reviewing samples, not filling in forms. And when the vendor sends a new catalog, the same process can run again.

What we built
With the catalog solved, the store itself follows what a rug buyer needs to decide from home:
- Browsing by collection, with each collection's starting price visible up front.
- Filters that speak the product's language: size (from 2'x3' to 12'x15'), room, need, color and material. You choose a rug by the space it will fill, not by a generic category.
- Product pages with size variations, each with its own price, straight from the vendor's price sheet.
- Stripe checkout, with free shipping across the US and a 30-day return policy stated before purchase.
- Its own admin panel, so the family can update products, prices and orders without depending on us or paying for an app per feature.
- Journal, the store's content section, to answer questions from shoppers researching before they buy.
Under the hood the stack is standard: Next.js on the front end and back end, Drizzle ORM over Postgres for catalog and orders, Stripe for payments and Vercel Blob serving images. With a large catalog, poorly served images are what make a store slow, so that got attention from day one.

Why custom instead of an off-the-shelf platform
A platform like Shopify is the right choice for many stores, and we say so to people who reach out. At Loom Genie, three factors pushed toward custom:
- The import was the project. Any platform would have required the same work of turning PDF into structured data. Once that was done, loading it into our own database was the shortest path.
- The filters are product-specific. Size in feet, room, material and need (such as pet-friendly) are the core of navigation, not an add-on.
- Control without a per-feature subscription. Admin, variations and pricing rules live in the system itself, with no stack of paid apps.
For more on when a custom build beats a template, see our take on Next.js for production systems.
The takeaway
The bottleneck in an e-commerce project is rarely the store's code. It is the data. Loom Genie had a rich catalog, good photos and decades of product knowledge, all locked in PDF. Solving the import first turned a project about "entering hundreds of products" into a project about "building the right store".
The store is live at loomgenie.com, and the full case, with more images, is at projects/loom-genie.
If your catalog also lives in a PDF, a spreadsheet or an old system, and that is what is holding back online sales, get in touch. Impulse Works builds e-commerce in Next.js and solves the hard part first: getting the data into the store right.



