City Roots VT
Editorial site and ordering app for a farm-to-table service
A farm-to-table food service in Vermont: an editorial presentation site plus a dedicated ordering app. Order ahead by Sunday, pick up Wednesday, all season long.

The Challenge
One brand, two surfaces, two audiences. The presentation site had to feel editorial (story, producer features, a clear “how it works”) and stay editable by the City Roots team with no developer dependency. The ordering app had to be lightweight and trustworthy on mobile: a single-page flow where a customer can land, pick dishes and check out in under a minute, even on flaky rural connections. Both had to share a tightly controlled brand system, so users never feel like they've left for somewhere else.
How I Built It
Two codebases, one visual language. The presentation site is WordPress, with a custom build on Elementor + ACF, its own CPT for the weekly menu and LiteSpeed caching, so it's fast from the first byte. The ordering app is React: installable as a PWA, dark/light-theme aware, tuned for the rural 4G case with route-split chunks and a cart that survives a tab close. Both surfaces share the same design tokens (Lexend + Work Sans, the City Roots green, the paper-cream tone), so brand unity never breaks at the jump from .com to order.*.
Editorial site on WordPress
A custom Elementor + ACF build with its own post type for the weekly menu and LiteSpeed caching, fast from the first byte and editable by the team.
Ordering app in React
Installable as a PWA, dark and light theme aware, route-split for rural 4G, with a cart that persists across sessions.
One brand system
Shared design tokens, Lexend + Work Sans, the City Roots green and the paper-cream tone, so nothing breaks at the jump from .com to order.

Results That Matter
Two surfaces that feel like one brand. The City Roots team edits the presentation site and the weekly menu without a developer, and customers land in the ordering app, pick dishes and check out in under a minute on rural 4G, with a cart that survives a closed tab.
What I Delivered
- WordPress presentation site with Elementor + ACF
- Custom post type for the weekly menu
- React ordering app installable as a PWA
- Route-split chunks and a cart that survives a tab close
- Shared design tokens across both surfaces
- LiteSpeed caching, fast from the first byte






