New Life Spaces: Room Visualizer AI Chat Assistant

New Life Spaces is a design-build remodeling company in Upstate New York built around light, nature and craftsmanship, and a lot of their work starts from a gutted basement or a room down to bare studs, not a finished space. The hardest part of selling that kind of project isn’t persuasion, it’s imagination: most homeowners can’t look at exposed joists and a concrete floor and picture a finished room in one of the company’s own design styles. I built Room Visualizer, a custom WordPress plugin, to close that gap directly on their site: a chat assistant that turns a visitor’s own photo into an AI redesign of their room, shown next to a real New Life Spaces project of the same room type, with the conversation ending in a qualified lead in the team’s inbox.

What I built

Room Visualizer is a self-contained WordPress plugin, about 2,450 lines of hand-written PHP, JavaScript and CSS, with its own REST API namespace, its own tabbed settings screen, and its own private lead-storage post type. No page builder, no third-party chatbot embed. A visitor opens the chat, answers a few questions, uploads a photo of their room, gutted, mid-remodel or already finished, picks one of four design styles, and within about a minute sees an AI redesign of their own room, next to a real New Life Spaces before-and-after of the same kind of room.

A New Life Spaces basement kitchen, finished: butcher-block counter spanning the original support columns, black stools, ribbed pendant lamp and oak floor.
One of the real New Life Spaces projects the widget shows: a basement kitchen, finished. The counter was built to span the existing support columns rather than work around them.

Prompting for a real remodel, not a showroom render

Calling OpenAI’s image-edit endpoint was the easy part. Making the result look like a job New Life Spaces would actually build was the real work. Each of the four styles on offer, Japandi, Biophilic, Nordic Simplicity and Living Materials, carries its own prompt written around the specific materials the company builds with: solid oak and hickory floors, butcher-block counters, live-edge shelving, matte black fixtures, shoji-style sliding screens, not just a style name handed to the model. And because most of the photos this widget actually receives are from a construction site rather than a finished room, every room type also carries its own “what finished looks like” checklist. For a bathroom, that means a vanity, a toilet, and a shower or tub placed where the existing plumbing already is. The prompt tells the model exactly what “done” means for that specific room before it ever touches the photo, and handles the opposite case too: if the room is already finished, it restyles the finishes and furnishings instead of trying to rebuild a room that doesn’t need it.

BeforeA New Life Spaces basement bathroom corner before work: concrete block walls, a small window, exposed plumbing and insulation.
AfterThe finished New Life Spaces bathroom: a soaking tub with black stone surround, tiled niches holding plants, and a bamboo shade at the window.
The kind of change the widget is built to show: a real New Life Spaces basement bathroom, before and after, the same corner and the same window.

Built so it can’t run away with the client’s OpenAI bill

Every AI design costs New Life Spaces real money, so the plugin treats every anonymous visitor as a potential script until proven otherwise. A signed session token, tied to the visitor’s IP and issued when the chat opens, has to be presented with every request and is refused if it’s used too quickly after the chat opened or too long after it expires. A honeypot field catches simple bots outright. Uploaded photos are checked by their actual bytes, not their declared file type, and capped at 8MB. Each visitor gets one free AI design, tracked by IP and by email so switching one doesn’t reset the other, and that allowance is claimed before the paid call goes out and only released if the call fails, so two requests in parallel can’t both slip through. A site-wide daily cap on paid renders sits underneath all of it as a hard stop on cost.

Real work, always on screen, even when the AI isn’t

If OpenAI is slow, over quota, or simply not connected yet, the widget never shows an error. It falls back to a client-side color preview, generated instantly in the browser from the same palette each style already defines, so a visitor always sees something happen. The AI result and the real project photo are both shown in the same drag-to-compare slider, not a static side-by-side, so comparing “your room” to “our work” feels the same either way.

Everything editable without touching code

The team runs this from an ordinary WordPress admin screen: six tabs covering general visibility, the OpenAI connection (with a free “test connection” check that verifies the API key without generating an image), the chatbot’s wording and colors, the four design styles, the five rooms and their example photos, and lead handling. Each tab saves independently, so editing the welcome message can’t accidentally blank the API key. Every lead lands in a private post type only administrators can see, with the room, style and note laid out in a table and an email sent straight to the team with Reply-To set to the visitor’s own address.

Where it stands

Room Visualizer is live in Live mode, real AI designs, real cost per render, on New Life Spaces’ Design Philosophy pages, the pages a visitor is already on when they’re picturing a style for their own home. It’s a deliberate, scoped rollout rather than a site-wide flip: the plugin’s per-page targeting keeps it off the rest of the site for now, so the team can watch real designs and real leads come in from its best-fit pages before switching it on everywhere.

Rank Analyzer: AI SEO Platform & Chatbot

Rank Analyzer is an AI-powered SEO and content analysis tool I built and run myself, aimed at marketers and SEO teams navigating the shift to generative search: Google’s AI Overviews, ChatGPT search, and the other AI answer engines that now sit between a search and a click. It needed a marketing site that could explain a genuinely technical product in plain language, and a way to answer the questions every visitor asks (what’s included, what does it cost, how is this different from a normal audit) without me answering each one by hand.

What I built

The site itself runs on WordPress and Elementor. Behind the chat bubble in the corner is a custom WordPress plugin I wrote rather than a third-party embed, a guided assistant that actually knows the product’s plans and pricing instead of deflecting to a contact form.

The homepage sets out the product in three parts: live research across major AI search engines compiled into a dataset-type scoring table, a content recipe (headings, proportions, schema markup) built to match what those engines reward, and an eight-week cluster plan with multimedia ideas to build topical authority beyond a single article.

The chatbot

The custom AI chatbot widget on Rank Analyzer, open and showing its quick-reply topics
The chatbot open on the homepage, offering guided topics rather than a blank message box.

It knows the actual pricing, not just “get in touch”

Asking the bot about the flagship offer doesn’t route to a contact form. It names the plan, the price, and exactly what’s included: a comprehensive report, on-page and technical audit, dataset scoring with competitor insights, and keyword-gap opportunities. Most chat widgets bolted onto a marketing site can’t do this, because they’re not actually wired to the product.

Knowing when to stop guessing

I tested it with an open-ended question it hadn’t been given a script for (how this compares to a normal SEO audit tool). Instead of improvising an answer it couldn’t stand behind, it acknowledged the question and pivoted into collecting a name and contact details for a real follow-up. A wrong guess from a chatbot costs more trust than an honest handoff, so the bot is built to know the difference between a question it can answer on the spot and one that needs a person.

Testing

I test the chatbot the same way a real visitor would: working through each quick-reply path (SEO analysis and strategy, pricing and plans, getting a quote, existing-customer support) and then trying to break it with questions outside the script, checking that it either answers correctly or hands off cleanly rather than inventing something.

Sacks.ie: DPD Ireland Shipping Integration

Sacks Online Ltd run a busy Irish e-commerce store shipping bulk bags and sandbags nationwide, and every parcel meant re-typing a customer’s address into DPD’s portal by hand before printing one label at a time. No existing plugin fit: WooCommerce shipping plugins on the market target DPD UK and DPD Netherlands, entirely different platforms from DPD Ireland’s API, and the only off-the-shelf route was paid middleware sitting between the shop and the courier. Since DPD Ireland’s API is just three endpoints (authorise, create consignment, track), building directly was cheaper and cleaner, and the client owns the result outright with no recurring fee.

What I built

A self-contained WooCommerce plugin providing:

  • One-click label creation from the order screen, with parcel count and weight prefilled from the order’s own data
  • Bulk label creation and printing: select a batch of orders, create every consignment, and print them all as one job
  • A label icon on the orders list showing the consignment number, so a label can be reprinted without opening the order
  • Automatic consignment creation on a chosen order status, running in the background so checkout is never delayed
  • Customer-facing tracking links on the order and in notification emails
  • A test and live environment switch, with the interface making it unmistakable which one is active

The interesting problems

Most of the value in an integration like this isn’t the happy path. It’s the details that quietly produce wrong outcomes months later.

Northern Ireland is not the UK for customs

Northern Ireland addresses arrive in WooCommerce with a GB country code and a BT postcode, and the obvious mapping, GB means UK means a customs declaration, would have been wrong for a large share of orders. Under the Windsor Framework, Ireland to Northern Ireland stays inside the EU customs area for goods, while Ireland to GB mainland doesn’t, so the plugin classifies destinations on postcode as well as country. I verified this against the courier’s live routing rather than the documentation: the test label came back reading “NORTHERN IRELAND” despite the GB code we sent.

DPD test shipping label for a Northern Ireland address, showing NORTHERN IRELAND as the destination
Test label for a BT postcode address. The destination reads Northern Ireland even though WooCommerce sent a GB country code.
DPD test shipping label for a Republic of Ireland address
The equivalent label for a Republic of Ireland address, for comparison.

A rejected shipment can look exactly like a success

The courier’s API returns HTTP 200 with a status of “OK” even when it has rejected a consignment, with the rejection buried in a per-consignment error field, and the rejected record still carries a tracking number. Reading the tracking number and assuming success would have recorded failed shipments as booked, so the parser checks the overall status, then the per-consignment error, and only then reads the tracking number, covered by tests built from the API’s own rejection samples.

Three more details worth getting right

  • The label lives behind a second request. The API returns a URL rather than the label itself, and since that URL arrives inside a response body, it’s validated against the courier’s whole domain before being fetched, guarding against a classic server-side request forgery.
  • One special character, one silently deleted field. PHP’s DOMDocument::createElement() parses rather than escapes its value, so a customer trading as “Caffè & Sons Ltd” produced an empty business name element with no error or warning. A test built from hostile input caught it before it reached a real address.
  • The label format followed the printer, not the spec. ZPL looked obvious for the warehouse’s Zebra printer until it turned out to be USB-connected to one PC, where a browser can’t push raw ZPL without extra software. The courier’s PDF prints straight through the Windows driver, so batching moved into the plugin instead, merging each run into one multi-page PDF.

Testing

Courier APIs are awkward to develop against: every call is stateful, and on a live account every consignment costs money. A headless test harness runs the plugin’s real classes with WordPress replaced by lightweight stubs, exercising the whole pipeline from the command line against DPD’s pre-production environment, backed by around seventy unit assertions built from the API’s own sample payloads. Credentials stay out of the database in favour of configuration constants, and every logged request is scrubbed of credentials and session tokens.

Need DPD Ireland integration for your store?

I build and fix DPD Ireland integrations for WooCommerce, Shopify and custom stores. See how it works and request a quote: DPD Ireland integration for WooCommerce and Shopify.

What’s On: Reykjavík Events Platform

What’s On has been Reykjavík’s event guide since 1994, in print and online, so their site needed to carry that same reliability. The brief was another straight Figma-to-build: take a finished Figma design and implement it faithfully in WordPress and Elementor, matching every layout and type detail without shortcuts.

The centrepiece is the events calendar, which doesn’t run on hand-entered listings. It pulls live event data from an external events API and renders it as a continuously updated, filterable grid, browsable by week, complete with venue, category and imagery for each listing. When an event’s details change upstream, the site reflects it automatically, with no one on the What’s On team re-typing a single listing.

MRC Recruiting: Live Job Board Integration

MRC Recruiting runs on Recruit CRM to manage every open role, but their WordPress site had no live connection to it. Job postings would have needed manual copy-pasting to stay current, with a real risk of closed roles sitting on the public site for weeks.

We built a custom plugin that pulls job data directly from the Recruit CRM API into WordPress through two shortcodes: a searchable job list and a full job detail page. Search filters (keyword, location, location type, job category) are built dynamically from live job data, so new locations and categories appear on their own as new roles are posted. Closed, on-hold, and application-disabled roles are filtered out automatically at fetch time, and a short cache window keeps the site refreshed against the API within seconds, not the multi-minute delays the earlier caching approach allowed.

Iceland Review: Editorial Platform Rebuild

Iceland Review is Iceland’s leading English-language news portal and travel adviser. It’s part daily news for readers following the country, part travel guidance for visitors planning a trip. Almost all of its income comes from display advertising, so this rebuild couldn’t treat ad placements as an afterthought. They needed to be part of the layout from day one.

We rebuilt the platform on a custom WordPress theme with Advanced Ads managing every placement: banner units the editorial team can position and swap without touching a line of template code, sized to stay visible and viewable (which is what actually drives ad revenue) without slowing the site down or burying the articles underneath them.

Around that ad infrastructure, we restructured navigation for the site’s two real audiences: News for readers following Iceland day to day, and Travel for visitors planning ahead. We also cleared years of accumulated technical SEO debt and set up an ongoing webmaster relationship that’s still running today.

Real Search Console data over the past 3 months:

Google Search: 61.5K clicks, 5.44M impressions over 3 months
Google Search: 61.5K clicks, 5.44M impressions over 3 months
Google Discover: 1.55K clicks, 60K impressions, including a single-day spike
Google Discover: 1.55K clicks, 60K impressions, including a single-day spike
Google News: 1.22K clicks, 38.2K impressions at a 3.2% CTR
Google News: 1.22K clicks, 38.2K impressions at a 3.2% CTR

Líparít: Advertising Agency

Líparít is a small but well-established branding and packaging design studio working out of Reykjavík and Akureyri, with a client list that includes Arna, Freyja, ORA, Klaki and TourDesk. Their own site needed to hold up to the same design standard they deliver for clients, so the brief was a straight Figma-to-build: take their finished Figma design and implement it in WordPress without deviating from it.

We built the site on Elementor (on top of the Hello Elementor base theme), translating the isometric brand mark, typography and spacing from the Figma file into a fully responsive layout, pixel by pixel. The centrepiece is a self-service portfolio grid: dozens of real packaging and branding projects, from Easter confectionery for Freyja to dairy branding for Arna to conference identity work for Norðanstormur, built so the two-person studio can add new case studies themselves without touching code or calling a developer.

Iceland Now: AI News Publisher

IcelandNow.org needed a steady stream of Iceland-focused travel and news content without a full editorial team behind it. We built a self-contained WordPress plugin that handles the entire pipeline. It pulls from configured RSS feeds and scraped Icelandic news listings, maintains a demand-ranked queue of evergreen travel topics, and runs a trend-detection engine that catches breaking stories (like a pilot strike) while they’re still hot.

Claude writes every draft in a journalist or travel-writer voice. An Iceland-relevance filter runs at both fetch and generation time to keep foreign and hyperlocal-only stories out, and images are sourced in parallel from Flickr and Unsplash, scored and matched, with a 500-photo memory so nothing repeats. Every draft is scored against a quality gate before it’s even illustrated; anything below the bar is skipped rather than published.

What passes gets Yoast SEO meta, schema.org markup, and up to four internal links into existing posts, then lands in an admin dashboard for a final human review before it goes live. Alongside the automated batches, a “Write an Article” tool lets the team generate a single on-demand piece from just a topic (and optionally a source URL to ground it in), with a length dial running from a tight 450 to 700 word rewrite up to a 1,300 to 1,800 word in-depth guide, saved as a draft or published immediately.

elegantweb studio Get Started ↗
Email