TidingsIntake to Summary Email
What it does for you
Messy intake forms become a clear summary and a friendly reply.
Turns a messy intake form into a normalized team summary with completeness and urgency scoring plus a warm reply saved only as a draft, with an optional Claude rewrite held to the same local checks.

Who it's for
Service businesses that get long intake forms and want to answer quickly without losing the details. It only writes drafts, so a person reads every reply before it goes out.
Screenshots

In more detail
Tidings takes a messy intake form submission and turns it into two things: a clean summary for the team, and a warm first reply to the prospect, saved as a draft for a person to review. It never sends anything. The sample business is a fictional firm, Cedar Lane Care Advisors, that helps people open home care agencies.
Honest limits
The Claude rewrite mode is only tested against synthetic responses, never live ones. The sample content is not legal or licensing advice, and the app says so in a banner and on the printed output. Phone rules are US-first. This runs and is well tested on fixtures, not on a real inbox.
How I built it
This was a Claude Cowork build. My instruction was simple: one-shot all the Cowork projects. Claude Cowork took #38 and specced, built, tested, screenshotted, and documented it in one autonomous pass, about 0.8 hours. A separate Cowork session did this for all 20 Cowork projects, and the finished builds landed in the repo within about a minute of each other. Honestly, setting up a Cowork plugin felt faster than setting up a Claude Code build.
I set the spec: score the intake, flag urgency, write a summary and a "we" voice reply, add an optional Claude rewrite held to local checks, and ship a Cowork skill that only ever creates a Gmail draft.
The core, intake.js, reads JSON, Google Form rows, notification email text, or a built-in form, and cleans phones, emails, fuzzy dates, and budgets. One validator referees every draft, whether it came from the template, a hand edit, or Claude. That includes a no-invented-facts check: every number, state, month, email, and link in the draft has to appear in the intake or the firm's own details.
I have not hand-reviewed every line of the core. The test suite is what this build trusts.
What I learned
- A
\bafter the day in an ISO date regex fails on real timestamps like2026-09-21T16:40:00Z, becauseTis a word character. The submitted date silently vanished until a real fixture caught it. A(?!\d)lookahead fixed it. Tidy test strings would never have shown this. - A fact check has to compare whole tokens. My first version matched digits by substring, so an invented "5" passed because the firm phone contains 555.
- Quoted-printable soft wrapping must never split an
=XXescape, and the only test I trust for it is an independent decoder round trip. - Draft-only is a design rule, not a footnote. The
.emlcarriesX-Unsent: 1, Claude never sees the prospect's email or phone, and the Cowork skill is allowedcreate_draftand nothing that sends.
What carried forward
The shape is the same one the Claude Code builds used: a DOM-free core imported by both the page and verify.mjs, plus a tiny serve.mjs. It also shares a problem with #40 CSV Doctor from the same Cowork batch: the file-writing step turned unicode escapes into literal em dashes, and both builds added a dash sweep to their tests to catch it.
If I took it further
I would let the firm edit its own voice settings (sign-off, phone, phrases it likes and bans) in the page, since those rules are already data in the core, and test Claude mode against a recorded set of real responses.
#038 Built with Claude Cowork September 23, 2026 298 automated checks