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