Changelog
You're running v0.2.3.
# Changelog
All notable changes to Nifty Ops are recorded here. The format follows
[Keep a Changelog](https://keepachangelog.com/), and the project aims to
follow [Semantic Versioning](https://semver.org/).
The version shown in the app footer is the crate version
(`CARGO_PKG_VERSION`); this page is the embedded `CHANGELOG.md`.
## [0.2.3] - 2026-06-04
Finished the design-system consolidation. The app now ships a single stylesheet
system (the clay brand) instead of three overlapping ones, and the last legacy
surfaces were rebuilt on it.
### Design & UX
- Retired the legacy `main.css` entirely. Its global reset and skip link moved
into `admin.css` (the single app stylesheet, now loaded once in the base
layout); fonts load once in the base layout too. The public marketing and
booking pages keep their own `app.css`.
- Rebuilt the platform-admin pages (dashboard, all studios, all people) and the
studio 404 on the clay account shell, replacing the old `admin-*` / `button` /
`*-list` classes. Added a reusable `.ac-list` row component for the
platform tables.
- Removed the unused marketing header partial.
### Engineering
- One app stylesheet vocabulary (`.ad-*` / `.ac-*`) instead of two, so there is
a single, authoritative place for app styling. No more purple/Inter scheme
hiding under the cascade.
## [0.2.2] - 2026-06-04
A consistency and hardening release. The post-login pages were already correct
in source; this makes a stale binary or cached stylesheet far less able to make
them look broken, and unifies the last legacy surfaces onto the clay brand.
### Design & UX
- Pointed the legacy `main.css` tokens at the clay brand palette (warm paper,
espresso ink, clay accent, Fraunces + Geist). The platform-admin pages, the
studio 404, bare links, and focus rings now read as one product instead of
the old purple/Inter scheme.
- Hardened the profile photo uploader on `/me`: the file picker is styled, a
file is now `required`, so pressing Upload without choosing one shows a native
prompt instead of an error page.
### Fixes
- Cache-busted every first-party stylesheet with `?v={version}`, matching the
public `app.css`. Together with the existing `Cache-Control: no-cache`, a
deploy can no longer serve a stale stylesheet, which is what made buttons
appear to vanish and the UI feel unstyled. The footer version is the quickest
way to confirm a browser is on the current build.
## [0.2.1] - 2026-06-03
### Fixes
- Hardened the account pages (`/me`, profile, studio create) against horizontal
overflow on narrow phones. The top bar now wraps and the shell clips any
sideways overflow, so the "New studio" and "Create your first studio" buttons
can never be pushed off the edge of a small screen.
## [0.2.0] - 2026-06-03
A design and polish release. The studio admin became a sidebar console, the site
copy was rewritten in the studio's voice, and a caching bug that hid deploys is
fixed.
### Design & UX
- Rebuilt the studio admin shell as a fixed-sidebar console: a studio switcher,
grouped icon navigation, an active-item accent rail, and a pure-CSS mobile
drawer. Replaces the horizontal pill subnav.
- Made the create-studio path obvious on `/me`: a "New studio" button in the
account bar plus a solid button above the studio list.
- Rewrote site copy across marketing, auth, booking, studio, and admin pages to
read in the brand's quiet voice. Removed em dashes everywhere, including from
the concierge's outbound message humanizer.
### Fixes
- HTML pages now send `Cache-Control: no-cache`, so a deploy is no longer masked
by heuristic browser caching. Static assets already did this.
### Engineering
- Admin layout uses a CSS grid shell with a shrinkable main column, so wide
content like the week calendar can no longer force horizontal overflow.
- Added a regression test that HTML responses are served no-cache.
## [0.1.0] — 2026-06-02
First consolidated release. The non-voice MVP (per the product spec, payroll
excluded) is feature-complete.
### Onboarding & shell
- Rewrote `/me` into an honest onboarding state machine: a welcome hero with
one CTA when you have no studios, and per-studio cards with a real setup
checklist + next-step CTA once you do.
- Added a 5-step Getting Started checklist to the studio admin landing that
disappears once setup is complete.
### Core booking
- Public booking page (`/studios/{slug}/book` and on studio subdomains):
service → date → time slot, mobile-first, no account required.
- Appointment detail/edit: change status, reschedule (with availability
re-check), cancel; courtesy SMS on changes when SMS is connected.
- Week calendar view with status-coloured chips.
- Waitlist: customers join when no slots are open; staff work the list from
an admin page.
- Customer-facing **provider picker** — book with a specific provider; the
appointment is assigned to them.
### Payments (Stripe Connect)
- Studio onboarding via Stripe Connect Express (hosted KYC).
- Deposits at booking (configurable %), with `automatic_tax` and refunds.
- Tips, no-show fees, and balances as one-click Stripe payment links.
- **Card-on-file**: customers save a card via hosted setup; studios can
**auto-charge no-show fees** off-session, and returning customers with a
saved card have their **booking deposit charged off-session** — no Checkout
redirect (falls back to Checkout on decline).
### Communication & automation
- Two-way messaging inbox (SMS via Telnyx, Instagram DMs via Meta).
- AI concierge with tool use (`list_services`, `find_availability`,
`book_appointment`); per-studio persona ("AI Soul"); humanizer on outbound.
- Outbound SMS + email (Resend) booking confirmations.
- Background schedulers: appointment **reminders** (T-24h / T-2h), post-visit
**review requests**, and proactive **rebooking nudges** (opt-in per studio).
- **Missed-call text-back**: an unanswered inbound call to the studio's Telnyx
number auto-texts the caller a booking link (opt-in, custom message, with a
per-caller cooldown).
### Operations & reporting
- Staff management + roles/permissions; per-member **commission** rates.
- Per-employee **weekly schedules**; the availability engine honours them
per provider.
- Reports: 30-day revenue, bookings, by-service and by-staff (with
commission owed).
- Service catalog CRUD; locations; per-customer private notes.
### Engineering
- Rust + Axum + embedded SurrealDB v3 + Askama (SSR) + Datastar.
- Shared auth guards, one-shot SMS helper, Argon2 off the async executor.
- ~191 end-to-end + unit tests; `clippy -D warnings` clean.
[0.2.1]: https://niftyops.com/changelog
[0.2.0]: https://niftyops.com/changelog
[0.1.0]: https://niftyops.com/changelog