Apps for Mac, iPhone and Apple Watch, and free, open-source Homebridge plugins that bring the devices you already own into Apple Home, plus tools for QNAP NAS and Gmail. All products: www.ctsite.cc
| Product | What it does |
|---|---|
| Turnout | A VPN client for macOS that connects to WireGuard servers the way wg-quick does |
| Peaberry | A macOS menu bar app that lets AI agents keep the Mac awake while they work |
| Wata | Water reminders for iPhone and Apple Watch that log a glass when you hold your iPhone to your bottle |
| homebridge-roborock-vacuum | Roborock robot vacuums in Apple Home over HomeKit or Matter, with local control |
| homebridge-daikin-local-platform | Daikin air conditioners in Apple Home over HomeKit or Matter, local network only |
| homebridge-jci-hitachi-platform | Hitachi air conditioners from AirCloud Home (Hitachi Taiwan) in Apple Home |
| homebridge-panasonic-smart-app | Appliances from Panasonic Smart App (Taiwan) in Apple Home |
| homebridge-mqttthing-ex | MQTT topics as HomeKit accessories; the maintained successor to homebridge-mqttthing |
| DownloadCenter | Download manager for QNAP NAS |
| pigeon-post-for-gmail | Gmail unread counts and notifications in Chrome |
This repository is also the source of www.ctsite.cc, served by GitHub Pages from the root of the master branch. There is no build step.
| File | Purpose |
|---|---|
index.html |
The page |
site.css |
Styles; color tokens in :root, dark mode under prefers-color-scheme: dark |
site.js |
The floor plan: pointing at or scrolling to a product lights its room. The filters: picking a feature narrows the Homebridge plugins and highlights those devices on the plan. The app cards: launch state, price, "New" badge and line, and the directory's status lines, from the products' own published data |
404.html |
Page for unknown addresses |
about.html |
Who makes the products, what they are for, the blog article for each, and how to get help |
privacy.html |
Privacy policy, with the disclosures AdSense requires |
icons/ |
Product icons, copied from each product's site |
fonts/archivo-latin.woff2 |
Archivo variable font (Latin), self-hosted |
CNAME |
Custom domain for GitHub Pages |
ads.txt |
Authorizes the site's AdSense account to sell ads on ctsite.cc |
robots.txt |
Allows crawling and names the sitemap |
sitemap.xml |
The pages for search engines, with the date each last changed |
The page opens with a directory of four categories, each a tile linking to its section: Mac (#desktop), iPhone & Apple Watch (#iphone), Smart home (#smart-home) and NAS & Chrome (#tools). The Homebridge plugins and the tools sit beside the floor plan, where each is a device in the home; the feature filters apply to the plugins only.
The app cards carry their state as data, so a launch or a price change needs no edit:
data-statusissoonorlive. Asooncard withdata-store(macorios),data-bundle-idanddata-store-labelis looked up in Apple's lookup service (US store); once the store has the app,site.jsadds the store link and price and switches the card tolive.data-released(YYYY-MM-DD) anddata-new-line: aliveapp released withindata-new-days(on<main>, 60) days gets a "New" badge, and the newest one is named, linked todata-site, above the heading.data-pricingpoints at a price file on the product's site (Turnout'spricing.json). Its price replaces the text in[data-price], and a sale that hasn't ended shows in.sale.- The directory's status lines for
#desktopand#iphoneare counted from those cards. The text in the markup is what visitors without JavaScript see, so update it, and the cards' static state, when convenient after a launch.
Any new origin that site.js reads from must be added to connect-src in the CSP of index.html and described in privacy.html.
- Put the product icon in
icons/as.svgor.png, named in lowercase letters, digits and-. Copy it from the product's own site instead of linking to it. An icon drawn as a full square (as App Store icons are) getsclass="icon-square", which rounds it. - In
site.css, add the brand color to the product colors (one for light, one for dark) and a line.c-<name> { --c: var(--<name>); }. - In
index.html, copy a<li class="project">into the section for where it runs and change theid, thec-class, the icon, name, description, facts and links. For an app, set the data attributes above. Add its icon to that category's tile in the directory, and update the tile's line and the counts in its status line. - For a Homebridge plugin, set
data-tagson that<li>to the features it has, separated by spaces:matter(works with Matter),local(controls the device over the home network),verified(Verified by Homebridge),taiwan(for appliances sold in Taiwan). Leave it out if none apply. A new feature needs its own<button class="chip">in.filters; the counts on the chips are filled in bysite.js. - To show a plugin or tool on the floor plan, add an
<a class="dev">to<g class="devices">:hrefpoints to theidfrom step 3,data-projectis the sameid,data-roomis the room (bedroom, study, balcony, kitchen, living, dining, entry) anddata-wheredescribes the device. Draw it withclass="shape"outlines andclass="detail"lines, and optionally a<g class="fx">that appears while the device is lit; its animation goes insite.css, and its power-on delay in thenth-childlist there. - Add a line for it to
about.html, and update thelastmoddates insitemap.xml.



