INSIDE THE WORK / 003
The site, the hiring page, the upkeep.
Brought under one roof.
A family-owned plant that runs its own web presence, without running any software.
M&F Laundry Services has cared for the linen of Los Angeles hotels, spas and restaurants since 1974. Its web presence had grown into a handful of separate tools and fees: an ageing site on shared hosting, a hiring tool, form plumbing. We brought it together as one fast, bilingual site with hiring built in, and a way for the office to change it without a developer in the loop.
Live since September 2026
mflaundry.com ↗
01 / WHAT CONNECTS TO WHAT
Separate tools, separate fees.
One site that does the work.
Nothing here is exotic. The point is that the pieces now share one brand, one codebase and one accountable partner. The business mailbox stayed exactly where it was, because it worked.
- Ageing site on shared hosting
- Third-party hiring tool
- Form and email plumbing
02 / WORKFLOWS & EXCEPTIONS
Four things the office no longer needs us for.
Each path is written down with its steps and its awkward case. The exception is part of the design, with an owner and an outcome.
-
The office posts a job
A new role is on the site, and eligible for Google’s job search, the moment it is saved. No listing to buy and nobody to wait for.
- Someone in the office signs in to the admin.
- They write the posting: title, department, type, pay, schedule, duties, requirements and benefits, with a summary in English and in Spanish.
- Saving publishes it. The careers page and what search engines see both update at once.
- Closing the role takes it down. It can be reopened later with everything intact.
When it doesn’t go to plan
A closed posting doesn’t leave a dead page behind: its address sends visitors to the careers list. Every listing carries an expiry date, so a forgotten posting can’t advertise a filled job to search engines forever.
-
Someone applies from their phone
An application reaches the person hiring, with the resume attached and a reply one tap away.
- The applicant opens the posting and fills in a short form.
- They attach a resume as a PDF, a document or a photo taken on the phone.
- The hiring inbox receives it with the resume attached. Replying goes straight to the applicant.
- The applicant gets a confirmation.
When it doesn’t go to plan
Applications are never stored on the site, so there is no database of resumes to leak. If the confirmation email fails, the application still reaches the hiring inbox. A bot meets a hidden trap field, a minimum fill time and a rate limit, and is shown the normal success page so it learns nothing.
-
The office asks for a change, and it happens
New wording, a swapped photo, a fresh page: described in plain words, and live without a phone call.
- Someone writes what they want on a private request board, with a photo or screenshot if that helps.
- Moving the request to Ready is the go-ahead.
- The request is read back as a clear statement of what will change. If it’s unclear, one plain question comes back instead of a guess.
- The change is made, checked automatically, and given a second look when it is more than a small tweak.
- It goes live, and the request is marked Shipped with a note: it’s live, refresh the page.
When it doesn’t go to plan
A request can change words, pictures and pages. It can never reach the settings that keep the site running. Anything that includes a new image waits for a person to look before it goes live. If a check fails the change stops there, and nobody is told it shipped when it didn’t. What’s written in a request is only ever treated as a description of the change.
-
Both languages, every time
Spanish is part of the site, not a plugin laid over it.
- Every string lives in a pair of translation files, one English and one Spanish.
- A copy change has to land in both before it can go live.
- Visitors switch with a toggle that stays with them from page to page.
- Search engines are told about each language version of each page.
When it doesn’t go to plan
If a Spanish string is ever missing in production, the page falls back to English and never shows a raw key. Spanish covers the core pages and the careers list today; the service detail pages are still in English.
03 / ACCEPTANCE CRITERIA
What had to be true before it counted as done.
Specific conditions the business can see for itself. Most of them are about the day something goes wrong.
- The office can post, edit, close and reopen a role without us.
- An open role reaches Google’s job search with its pay, a direct way to apply and an expiry date. A closed role stops advertising itself.
- No applicant data is stored on the site. An application exists only as email in the hiring inbox.
- A failed confirmation email never loses an application or an enquiry.
- A bot sees the same success page as a person, and its message goes nowhere.
- One visitor can’t flood the inbox. Repeated submissions are slowed down.
- A change request can alter words, pictures and pages, and nothing else.
- An unclear request comes back as one plain question, never a guess.
- A change that includes an image always waits for a person.
- Copy changes land in both languages, and work at phone width.
- A missing translation falls back to English. It never shows a raw key.
- Every address from the old site still lands somewhere sensible.
- Motion pauses for visitors who ask for less of it, and the hero video stays off small screens.
WHAT WE LOOK AFTER
Their watercolor logo, kept.
Everything around it, tightened.
The design keeps the family’s original watercolor mark and builds a square, hairline, industrial setting around it, with the brand blue darkened until it met contrast requirements. The photography is the real plant and the real team. The hero video is small, has a fallback and a poster frame, and steps aside for reduced-motion visitors and small screens.
The cutover was deliberately quiet. Business email never noticed the move, and every address from the old site still leads somewhere sensible. Behind the request board, AI does much of the typing. The rules around it are fixed, and a person still sees anything those rules can’t vouch for.
Built and operated by Codewrights. Counts describe the site as it ran on 20 September 2026.
START WITH A CONVERSATION
Tell us what the business runs on today.
The tools, the workarounds, the things that fall through. We’ll tell you what we would build, what we would keep and what we would leave alone.
Start a conversationhello@codewrights.io