Search by

totalcms / starter-hvac

joeworkman

Foxtail Heating & Air: a heating and cooling company's site for Total CMS, with seasonal colors and offers, service and town pages, a ZIP check, service requests with photos, emergency alerts and ratings by town. Requires Pro.

Package info

github.com/totalcms/starter-hvac

Homepage

Documentation

Language:Twig

Type:project

pkg:composer/totalcms/starter-hvac

Statistics

Installs: 1

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-11-10 23:33 UTC

This package is auto-updated.

Last update: 2026-11-11 00:38:44 UTC


README

A heating and cooling company's website built on Total CMS. The demo business is Foxtail Heating & Air, a fictional HVAC company in Longmont, Colorado. Every page is filled with demo content, so the site works as soon as it's installed. Every template opens with a comment that explains what it does, so it's also a good site to learn from.

What's in it

  • A site that follows the seasons: cool blue and AC offers in summer, warm orange and furnace offers in winter. The season changes on the dates set in the admin.
  • Services and town pages: a page for each service and each town, with structured data that tells search engines what the company does and where.
  • A ZIP code check: visitors type a ZIP and find out at once whether the company comes to them.
  • Service requests: a public form, protected from bots. After sending it, the customer can add photos of the unit.
  • Emergency alerts: a request marked as an emergency sends an email and, once set up, a phone notification to the on-call technician.
  • Reviews by town: each town page shows its own star rating, worked out ahead of time by a Data View.
  • Maintenance plans, an FAQ, the team, and site search.
  • A printable service sticker with a QR code that books the next tune-up.

Install

With Composer:

composer create-project totalcms/starter-hvac mysite
cd mysite
npm install && npm run build

Point your web server's document root at mysite/public/, then visit the site. The setup wizard creates your admin account. Then open /readme on the site for a tour and a list of what to change before launch.

Set up the scheduled job

The emergency alert and the town ratings run in the background. Add this line to the server's crontab so they run every minute:

* * * * * cd /path/to/mysite && php vendor/bin/tcms jobs:process && php vendor/bin/tcms automations:process

Without it, requests are still saved and emailed to the office, but the emergency alert doesn't go out and the town ratings don't update when a review changes.

Phone alerts with Pushover (optional)

The emergency alert always sends an email. It can also send a push notification to the on-call technician's phone through Pushover:

  1. Create a Pushover account and install the app on the technician's phone. The user key is on the Pushover dashboard.

  2. Create an application in Pushover to get an API token.

  3. Put both keys at the top of the crontab, above the scheduled job:

    PUSHOVER_TOKEN=your-api-token
    PUSHOVER_USER=your-user-or-group-key
    * * * * * cd /path/to/mysite && php vendor/bin/tcms jobs:process && php vendor/bin/tcms automations:process
    

    The alert runs from cron, so the keys must be in cron's environment; keys set only for the web server (Apache SetEnv, a PHP-FPM pool) are never seen. config/tcms.php reads them, so they never go in the admin. A group key alerts a whole on-call team.

Leave them unset and the alert sends only the email. If the keys are wrong or Pushover can't be reached, the run fails and, on a production site, the office gets an "Automation Error" email.

Make it yours

  • Business details. Sign in at /admin and open Business Info: name, phones, address, hours, license number and financing.
  • Seasons. Seasons holds each season's headline, offer, photo, start date and color (a hue plus a color strength), plus the home page's thermostat setting, the emergency line under the buttons and the service listed first. Add a third season if the climate needs one. To show one season all year, pick it in Force a Season in Business Info. Add ?season=cooling or ?season=heating to any address to preview a season.
  • Services, towns, plans, reviews, team and FAQ. Each has its own collection in the admin. The ZIP check reads the ZIP codes on each town. A service's Safety Note (the gas warning on Furnace Repair, for example) shows in a red box on its page.
  • A login for the owner. Give the owner an account in the editor group. Editors can change the content and read service requests. They can't change mail, security or most other settings. The default editor group can also open Site Builder; turn that off in Access Groups if the owner shouldn't edit pages.
  • Colors and type. css/theme.css holds the font, the shapes and the emergency red. The season colors come from the admin. DESIGN.md explains the whole design system.
  • Templates. The pages, layouts and partials are Twig files in builder/.
  • CSS and JavaScript. Edit css/ and js/, then build them with npm run build. public/assets/ is build output, so don't edit it. FRONTEND.md has the details.

Photos

The demo photos come from Pexels, and CREDITS.md credits each photographer. Replace them with photos of the real team, vans and jobs before the site goes live: real technicians earn more trust than stock photos.

Going live

  1. Set up email in the admin's settings, so requests and alerts reach the office.
  2. Add the scheduled job above.
  3. Replace the demo reviews with real ones. Never publish made-up reviews for a real business.
  4. Set Site Environment to Production in the admin's General settings. Production keeps error messages short for visitors and makes the template editor read-only.

Requirements

PHP 8.2 or later, Node.js to build the CSS and JavaScript, a way to run a command every minute (cron), and a Total CMS Pro license for the domain you deploy to. The site uses custom collections, Data Views and automations.