Twisted Wood — design and stack

This domain is the catalog MVP. https://twistedwoodguitars.swiftstudios.ca

The source shop is https://twistedwoodguitars.com. Prices are USD because that is what the live shop charges. Pulled 2026-10-09: 40 products, 158 options, 238 photos.

Design philosophy

Build a Canadian instrument shop, the same character as the current site. The MVP's job is to make the catalog obvious. Checkout, artists, and dealers come after the products are right.

How the infrastructure works

A browser resolves twistedwoodguitars.swiftstudios.ca to 72.251.4.92. That name is one label under swiftstudios.ca, so the wildcard already points it at the Gridlink edge. Caddy on the edge terminates HTTPS and holds the certificate. An SSH tunnel carries the request to Super-Micro. The house does not open an inbound port.

On Super-Micro, nginx listens on 127.0.0.1:8091 and routes by the Host header. f5backup.com names go to the WordPress container. Every other name, including this one, goes to the hosting container on 127.0.0.1:8088.

Apache inside that container serves this site. The Unix account is twistedwoodguitars, because the public hostname is 35 characters and a Unix name stops at 32. The files are in /home/twistedwoodguitars/public_html. SSH as twistedwoodguitars@super-micro.sw7ft.com lands in that account. From outside the house the same user is port 20001 on 72.251.4.92.

How SQLite is used

One SQLite file is the store. It is data/catalog.sqlite in the project, and the same file is published at /data/catalog.sqlite. There is no MySQL and no WooCommerce database on this container. The old shop was the source we copied. This file is what we edit from here.

Prices are integer cents. A dollar is 100. That keeps tax and totals exact.

What a customer buys:

The pages you see are HTML generated from those tables. The browser does not open SQLite yet. Rebuilding pages is python3 utilities/build-twistedwood.py --pages.

The cart and checkout will use this same file, not a second database. A cart line will store the variation id, or the product id when there is no variation, plus a quantity. An order will be a row plus line items that point at those same ids. Stock updates write back to the variation or the product. Photos stay files on disk. The database only stores the path.

SQLite allows one writer at a time. That fits this shop. The catalog is read by generating pages, and later by a small Python app in this container that opens the file for the cart. We do not put a database server in front of it.

Marketing photos are a separate table, not product rows. kind is slide or campaign. Each row has a label, the source URL, and the local path. The files are in public/assets/marketing/. The homepage shows the slides with those labels. The full set is at /marketing/.

Stack

The hosting container has Apache, Python, and Node. It does not run PHP, so this MVP is static HTML generated from that SQLite file.

Tables