Releases
Release notes
New features and fixes included since the last production deployment.
Deployment baseline
These notes cover the changes prepared after the production release at /var/www/crafterops/releases/20260710020804-local.
New features
- Added customer proposals with secure approval links, optional and required add-ons, choose-one packages, live totals, option tax, selected-work approval, immutable revision snapshots, and approval evidence.
- Added estimate deposit tracking after proposal approval. Teams can record payments and corrections, while only an owner can waive a remaining deposit; follow-up job and confirmation-email actions are queued reliably.
- Added room-first estimate measurements. Painters enter room length, width, and wall height, while CrafterOps calculates gross wall and ceiling area and keeps optional detail work separate.
- Added an explicit per-room Paint ceiling choice. Ceiling measurements remain visible, but are excluded from labor and material totals unless selected.
- Added separate interior and exterior paint defaults per estimate, with inherited room/elevation products and per-room or per-elevation overrides. Paint gallons and material cost now use each selected product's coverage and cost.
- Added country-aware state/province selection for customer and contact addresses to reduce inconsistent address data.
- Reorganized workspace settings into expandable areas for company, estimating, customer documents, and workspace preferences.
- Updated registration and password fields so passwords are hidden by default and the visibility icon accurately shows the next action.
- Added public marketing pages, painter-focused product messaging, and new visual assets for the CrafterOps website.
- Added a platform control center for the platform owner and operations staff. The standard global menu now shows a distinct, role-aware Admin menu with access to the control center, organizations, staff access, and audit activity.
- Added platform roles and permission packs: Superadmin, App Admin, App Support, App Billing, and App Security. Superadmins can invite staff, assign roles, add eligible direct permissions, revoke invitations, and revoke active sessions.
- Added organization lifecycle controls: suspend, reactivate, schedule a retention-period purge, mark test organizations, and permanently delete organizations with a typed confirmation. Permanent deletion also removes associated Backblaze objects.
- Added platform invitations, a first-use Superadmin bootstrap option, a platform-internal organization for staff accounts, and an audit log for privileged platform actions.
- Payment terms customizer for crafters, including organization defaults, per-estimate overrides, common payment templates, editable milestone schedules, help text, use cases, and live amount examples based on the current estimate total.
- Payment terms now appear on customer estimate previews in English and Spanish, and official revisions snapshot the selected template, calculated amounts, and customer-facing wording when the estimate is sent.
- Added work-site payment-term guardrails. Estimates can apply configured statewide deposit rules, calculate a capped approval payment, preserve the later schedule, and add the applicable rule notice to customer previews.
- Manual estimate delivery lets the team mark an estimate as officially sent after emailing, texting, printing, or handing it off outside CrafterOps. Delivery method, recipient, note, sender, sent time, and revision number are saved.
- Estimate sending now distinguishes working previews from official customer revisions, so printing or previewing does not accidentally create an official sent version.
- Draft estimates can be created from a dedicated new estimate route and inherit the organization's current default payment terms.
- Estimates can be marked as favorites from the workspace and estimate editor.
- Unsafely removable draft estimates can be deleted only while still unsent, unviewed, unapproved, unconverted, and without revisions.
- Estimate photos can be edited, deleted, and reordered. Media lists now respect saved sort order.
- Client records can store an internal primary address separately from customer-facing estimate documents.
- Document branding has an option to show the business name beside the uploaded logo on customer documents.
- Official estimate docs now explain platform email delivery, manual handoff, revision snapshots, and what is safe to preview or print.
Fixes
- Prevented password-manager UI injection from causing a React hydration recovery on the platform staff invitation form.
- Fixed the local database/schema mismatch that caused
PrismaClientKnownRequestErrorwhendefaultPaymentTermswas read before the payment terms migration existed in the database. - Made the payment terms migration idempotent with
ADD COLUMN IF NOT EXISTSso rerunning migrations is safer across local, demo, and production databases. - Restored Prisma migration status against the actual local CrafterOps Postgres database on port
54329; all 15 migrations now report up to date. - Prevented official revisions from changing when a crafter edits the working estimate after sending; new terms apply only to the working version until another revision is sent.
- Added validation so manual customer price overrides require a reason.
- Kept internal client addresses out of customer-facing estimate documents.
- Added deploy excludes for local
.pnpm-store, TypeScript build info, and generated Next type files so release syncs stay clean.
Verified
- TypeScript check passed.
- ESLint passed.
- Production build passed.
- Prisma migration status reports the database is up to date.
- Customer estimate preview route returns
200. - Payment terms smoke test passed for organization defaults, draft inheritance, estimate override, official revision snapshot, and working-version edits after sending.
- Platform-access migration, role/permission checks, platform APIs, and the production build passed verification.